Bash は $? を返しません。コマンド出力がローカル変数に割り当てられると、変数は正しいものになります。
test() {
aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 124 (!=0 as expected)
local aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 0
}
なぜ?
答え1
local
はそれ自体のコマンドなので、(シェル組み込み)local
コマンド置換では、パイプの戻り値の代わりに戻り値を取得します。変数を割り当てる前に、変数をローカルで宣言することを検討できます。これにより、local
コマンド置換と同じパイプラインで組み込み変数が呼び出されるのを防ぎ、コマンドの終了コードがあいまいになるのを防ぎます。
foo() {
local bar
bar=$(baz)
echo $?
}