次のオプションを使用しています
set -o pipefail
set -e
エラー時に実行を停止するbashスクリプト。100 行ほどのスクリプトを実行していますが、スクリプトのすべての行のリターン コードをチェックしたくありません。
しかし、ある特定のコマンドについては、エラーを無視したいと考えています。どうやってやるの?
ソリューション:
particular_script || true
例:
$ cat /tmp/1.sh
particular_script()
{
false
}
set -e
echo one
particular_script || true
echo two
particular_script
echo three
$ bash /tmp/1.sh
one
two
three
印刷されることはありません。
pipefail
また、がオンの場合、パイプ内のコマンドの1つにゼロ以外の終了コードがある場合、シェルはパイプ全体にゼロ以外の終了コードがあると考えるだけで十分であることを追加したいと思います(pipefail
オフの場合は最後のものでなければなりません) .
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
|| true
エラーを無視したいコマンドの後に追加するだけです。
停止せず、終了ステータスも保存します
特定のコマンドが失敗した場合にスクリプトを停止させず、失敗したコマンドのエラー コードを保存する場合:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
より簡潔に:
! particular_script
(強調鉱山)に関するPOSIX仕様から:set -e
このオプションがオンの場合、単純なコマンドがシェル エラーの結果にリストされている理由のいずれかで失敗するか、終了ステータス値 >0 を返し、while、until、または if キーワードに続く複合リストの一部ではない場合、およびAND または OR リストの一部ではなく、! が先行するパイプラインでもありません。予約語の場合、シェルはすぐに終了します。
「true を返す」代わりに、「noop」または null ユーティリティ ( POSIX 仕様で参照):
を使用して、単に「何もしない」こともできます。数文字節約できます。:)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
上からの簡単な解決策をありがとう:
<particular_script/command> || true
次の構造は、追加のアクション/スクリプト ステップのトラブルシューティングおよび追加のフロー制御オプションに使用できます。
if <particular_script/command>
then
echo "<particular_script/command> is fine!"
else
echo "<particular_script/command> failed!"
#exit 1
fi
必要に応じて、さらなるアクションにブレーキをかけることができexit 1
ます。