バックティック演算子が失敗した場合のbashを印刷して終了する方法

バックティック演算子が失敗した場合のbashを印刷して終了する方法

getinfo.sh情報を印刷するか、コード1が存在します。

このスクリプトの結果をbash変数に保存したいと思います。それ以外の場合は、エラーメッセージを印刷して終了します。

私がこれを実行すると

#!/bin/bash
X=`getinfo.sh` || echo "failed" && exit 1

これにより、スクリプトは成功しても終了しますgetinfo.sh(この場合は何も印刷しません)。

一方、

X=`getinfo.sh` || (echo "failed" && exit 1)

私にはCのような言語から来たので、これは意味がありますが、いいえ角かっこは、新しい内部シェルを作成して終了する内部シェルであり、シェルは引き続き実行されるため、スクリプトを終了します。

getinfo.sh印刷された出力を保存して失敗した場合は終了できますか?

答え1

(...)(主に)グループ代わりに、コマンドはサブシェルを開始します。したがって、exitInは(echo failed && exit 1)サブシェルのみを終了します。

サブシェルで実行せずにコマンドをグループ化するには、次のものを使用できます{ ...; }

X=`getinfo.sh` || {
  echo >&2 "failed"
  exit 1
}

ここでは、以下を使用したいと思います。

if ! x=$(getinfo.sh); then
  echo >&2 failed
  exit 1
fi

また、たとえば、stdout がファイルシステム全体のファイルであるか、壊れたパイプが SIGPIPE を無視するか、stdout がクローズされた場合、または SIGXFSZ のファイルサイズ制限に達した場合など、それ自体が失敗した場合、echo failed && exit 1シャットダウンはできません。echoこのような場合は無視してください。 ...

答え2

中かっこを使用すると、サブシェルを作成せずにコマンドをグループ化できます。

X=$(getinfo.sh) || { echo "failed" && exit 1; }

~からグループ化コマンドBash マニュアルのセクション

{ list; }

中かっこの間にコマンドリストを配置すると、そのリストは現在のシェルのコンテキストで実行されます。サブシェルは作成されません。末尾のセミコロン(または改行文字)リスト必要です。

注:バックティックは実際にはコマンドの置き換えには使用されなくなったため、より現代的な構文を使用しています$()

答え3

変数の値を設定することなので、変数の値を確認して不適切であれば終了してみてはいかがでしょうか?

X=`getinfo.sh`

[ -z "$X" ] && echo "failed" && exit 1

これはgetinfo.sh、失敗した場合にnullが返された場合、または長さが0の場合は終了すると想定されますが、失敗したX場合に返される内容に基づいてチェックを変更できます。または、より適切には、探しているデータ型が含まれていることをgetinfo確認してください。X

答え4

最も簡単な方法は、shebangに-eを追加することです。

#!/bin/bash -e

これは、スクリプトが最初のエラーで停止することを意味します。バックティックを使用しているので、エラーメッセージがあれば標準出力で見ることができます。

echo-and-exitメソッドを本当に使用したい場合は、常にエラーメッセージを印刷してすぐに終了する別の呼び出し関数を作成します。 Bash関数を書く方法を学びましょう(とても簡単です)。

関連情報