コマンド出力がローカル変数に割り当てられている場合、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 $?
}