宣言文が失敗した場合は 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と推奨されるエラー処理メカニズムについて詳しく説明します。

答え2

割り当ての右側のエラーと使用されたコマンドを区別する必要があります。ステートメントコマンドの「一行解決策」が必要な場合は、次のものを使用できます。

value=$(false); declare -r var="$value"

新しい変数を使用したくない場合は、$REPLY(読み取りに使用される)や$_(前のコマンドラインの最後の引数)などの組み込みの一時変数を使用できます。

使用法は$REPLY簡単かもしれません:

REPLY=$(false); declare -r var="$REPLY"

使用法は$_複雑で混乱する可能性があります。

私にとって:set -e使い方は解決策ではなく問題に近いことがわかりました。それを避けてください。

関連情報