web-dev-qa-db-ja.com

bash関数の結果をキャプチャし、終了できるようにします

この関数は、呼び出し元のスクリプトを終了する必要があります。

crash() {
  echo error
  exit 1
}

これは期待どおりに機能します。

echo before
crash
echo after         # execution never reaches here

しかし、これはしません:

echo before
x=$(crash)         # nothing is printed, and execution continues
echo after         # this is printed

関数の結果をキャプチャし、終了させるにはどうすればよいですか?

1
lonix

これは、$(crash)がサブシェルでcrashを実行するため、exitはスクリプトではなくサブシェルに適用されるためです。

とにかくスクリプトが終了したために出力を使用しない場合、変数に出力をキャプチャする意味は何ですか?

3
xenoid

これで問題が解決するはずです。

echo before
x=$(crash) || exit       # if crash give -gt 0 value then exit with the same value
echo after
1
terabyte