Bash エクスポートは set -ex を無視します。

Bash エクスポートは set -ex を無視します。

今日は奇妙な動作が発生しました。

#!/bin/bash
set -ex
export a=$(cat foo)
echo "It's a living thing"
b=$(cat foo)
echo "This won't make it"

cat fooこれは存在しなくても止まりませんfoo。ただし、エクスポートがないと失敗します。なぜ?

答え1

存在する:

a=$(cmd)

これはコマンド部分を持たない単純なコマンドなので、終了状態はコマンド置換状態です。存在する:

a=$(cmd) export a

または

export a="$(cmd)"

ここにコマンド部分があるため(一部のシェルでもexportコマンドとキーワードの間にあります)、終了ステータスが返されます。cmd失敗し、出力が生成されない場合export a=でも実行が継続され、成功するため、終了exportステータス0が返されます。

希望する場所は次のとおりです。

a=$(cmd)
export a

または、より良い方法は、信頼できない状況を排除し、手動set -eで適切なエラー処理を実行することです。

a=$(cmd) || exit
export a

たとえば、参照してください。BashFAQ 015:「set -eが私が期待どおりに機能しないのはなぜですか?」set -e予期しない結果が発生する理由と方法の詳細な例をご覧ください。

関連情報