長すぎます。後で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
難読化され、コマンド自体が問題なく実行されるため、変数に値を割り当てると組み込み機能が終了コードを設定してエラーを発生させます。発動しません。var
delcare
0
この問題を解決する 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
と推奨されるエラー処理メカニズムについて詳しく説明します。
答え2
割り当ての右側のエラーと使用されたコマンドを区別する必要があります。ステートメントコマンドの「一行解決策」が必要な場合は、次のものを使用できます。
value=$(false); declare -r var="$value"
新しい変数を使用したくない場合は、$REPLY
(読み取りに使用される)や$_
(前のコマンドラインの最後の引数)などの組み込みの一時変数を使用できます。
使用法は$REPLY
簡単かもしれません:
REPLY=$(false); declare -r var="$REPLY"
使用法は$_
複雑で混乱する可能性があります。
私にとって:set -e
使い方は解決策ではなく問題に近いことがわかりました。それを避けてください。