「ローカル」に終了コードをキャプチャさせるにはどうすればよいですか?

「ローカル」に終了コードをキャプチャさせるにはどうすればよいですか?

私のプロジェクトには次のスニペットがあります。

local output="$(bash "${1##*/}")"
echo "$?"

ただし、これは常に0を印刷するため、local削除すると変数が正しく機能localします。これはサブシェルの終了コードを想定しています。$?

私の質問は:終了値をキャプチャしながら、この変数をローカル変数としてどのように保持できますか?

答え1

代入する前にローカル変数を宣言してください。

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

私の考えでは、追加の変数を設定するよりもこれがRET読みやすくなります。これはYMMVですが、期待どおりに動作します。

答え2

#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

127これにより、「コマンドが見つかりません」の正しいエラーコードが表示されます。

これを使用してlocal複数の変数を定義できます。したがって、RET成功する前にサブシェルの終了コードをキャプチャし、それをゼロに設定するためのローカル変数も作成しました。local$?

関連情報