Bash は $? を返しません。変数が正しい

Bash は $? を返しません。変数が正しい

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 $?
}

おすすめ記事