web-dev-qa-db-ja.com

「ローカル」に終了コードをキャプチャさせる方法は?

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

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

localのため、これは常にゼロを出力しますが、localを削除すると$?変数が正しく動作する:これは、サブシェルからの終了コードを想定することです。

私の質問は、終了値をキャプチャしながら、この変数をローカルに保つにはどうすればよいですか?

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

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

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

16
DopeGhoti

割り当てる前にローカル変数を宣言します。

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

私の意見では、これは追加のRET変数を設定するよりも読みやすくなっています。 YMMVはその上ですが、期待どおりに機能します。

27
Wildcard