今日は奇妙な動作が発生しました。
#!/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
予期しない結果が発生する理由と方法の詳細な例をご覧ください。