宣言文が失敗した場合は bash を終了します。

宣言文が失敗した場合は bash を終了します。

長すぎます。後でbashが自動的に終了したいと思いますdeclare var=$(false)

私のbashスクリプトはset -e(またはset errexit)を使用します。しかし、declare変数宣言idiomを使用すると、declareシェル置換で戻りコードを「防止」するようです。

$ var=$(false)
$ echo $?
1

$ declare var=$(false)
$ echo $?
0

したがって、bashはエラーで終了しません。テストできることはわかっていますが、varすべてのステートメントの後にはあまりにも多くの問題が発生しますdeclare

失敗後にbashを自動的に終了する方法はdeclare

編集する:明確にするために、1)可能なローカルスコープ変数で動作し、2)可能な読み取り専用変数で動作し、3)1つの文のみが必要であるという答えを探しています。

ベストアンサー1

使用set -e意志いいえ持っているコードを使用すると、期待どおりに機能します。これは、errexitトリガコマンドがゼロ以外の終了コードを返す必要があるためです。

declare var=$(false)

割り当てfalseと結果によって$(..)ゼロ以外の終了コードが発生しても、を使用するとこのエラーコードがdeclare難読化され、コマンド自体が問題なく実行されるため、変数に値を割り当てると組み込み機能が終了コードを設定してエラーを発生させます。発動しません。vardelcare0

この問題を解決する 1 つの方法は、declare初期化と割り当てを分離することです。

#!/usr/bin/env bash

set -e
declare var
var=$(false)

上記の状況で使用すると、declare他の組み込み関数exportだけでなくlocal終了コードもあいまいになります。local関数の使い方を見る

set -e
f() { local var=$(false); }
f 

上記の場合と同様に、declare関数でlocal設定された終了コードは隠されています$(..)var機能するには、初期化と割り当てを分離する必要があります。

BashFAQ / 105 - -eを設定(または-o errexitまたはトラップERRを設定)すると、期待どおりに機能しないのはなぜですか?使用されるトラップset -eと推奨されるエラー処理メカニズムについて詳しく説明します。

おすすめ記事