回答:
ソリューション:
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
(ldd $2/bin/* || true) | grep "not found" | wc -l
スクリプトは、lddが失敗すると、この行の後で終了します
(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
。grep
何も見つからなかった場合は、ゼロ以外の終了コードが返され、パイプ全体がゼロ以外の終了コードを持っているとシェルが考えるのに十分です。
停止せず、終了ステータスも保存する
特定のコマンドが失敗してもスクリプトが停止しないようにして、失敗したコマンドのエラーコードも保存したい場合に備えて:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
command
は成功し、その後何を実行する必要があるから||
です。それを次のように読んでcommand
くださいEXIT_CODE=$?
。失敗した場合は、実行してください。command || echo "$?"
より詳細なデバッグを行うには、おそらく「トラップ」を実行するか使用するだけです。これを参照してください-> stackoverflow.com/a/6110446/10737630
より簡潔に:
! particular_script
(強調鉱山)に関するPOSIX仕様からset -e
:
このオプションがオンの場合、「シェルエラーの結果」にリストされているいずれかの理由で単純なコマンドが失敗するか、終了ステータス値> 0を返し、while、until、またはifキーワードに続く複合リストの一部ではない場合、およびANDまたはORリストの一部ではなく、!に続くパイプラインではありません。予約語、シェルはすぐに終了します。
-e
。
!
、シェルは何があってもシェルが終了するのを防ぎます。このスクリプトStill alive!
を実行すると、スクリプトが最後まで実行されたことを示すメッセージが表示されます。異なる動作を見ていますか?
if
節に入れて問題を解決しました。
しばらくは|| true
好ましいものですが、あなたも行うことができます
var=$(echo $(exit 1)) # it shouldn't fail
output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
echo $output
echo $exit_status
これを使用してログファイルを作成する例
log_event(){
timestamp=$(date '+%D %T') #mm/dd/yy HH:MM:SS
echo -e "($timestamp) $event" >> "$log_file"
}
output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
if [ "$exit_status" = 0 ]
then
event="$output"
log_event
else
event="ERROR $output"
log_event
fi
上記の簡単な解決策をありがとうございます:
<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
必要に応じて、さらにアクションを停止できます。
-e
されているように、属性が設定されている場合、「シェルは終了しません。失敗したコマンドが、while
またはuntil
キーワードの直後のコマンドリストの一部、if
ステートメントのテストの一部、実行されたコマンドの一部である場合中&&
または||
最後の次のコマンドを除いて、リスト&&
や||
、任意のコマンドパイプラインではなく、最後の、またはコマンドのリターンステータスが反転されているかどうかを!
。」