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

関連情報