617

次のオプションを使用しています

set -o pipefail
set -e

エラー時に実行を停止するbashスクリプト。100 行ほどのスクリプトを実行していますが、スクリプトのすべての行のリターン コードをチェックしたくありません。

しかし、ある特定のコマンドについては、エラーを無視したいと考えています。どうやってやるの?

4

12 に答える 12

1015

ソリューション:

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
于 2012-06-27T17:37:44.240 に答える
220

|| trueエラーを無視したいコマンドの後に追加するだけです。

于 2012-06-27T17:37:45.160 に答える
153

停止せず、終了ステータスも保存します

特定のコマンドが失敗した場合にスクリプトを停止させず、失敗したコマンドのエラー コードを保存する場合:

set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
于 2017-08-17T08:14:44.357 に答える
71

より簡潔に:

! particular_script

(強調鉱山)に関するPOSIX仕様から:set -e

このオプションがオンの場合、単純なコマンドがシェル エラーの結果にリストされている理由のいずれかで失敗するか、終了ステータス値 >0 を返し、while、until、または if キーワードに続く複合リストの一部ではない場合、およびAND または OR リストの一部ではなく、! が先行するパイプラインでもありません。予約語の場合、シェルはすぐに終了します。

于 2015-04-21T23:13:37.683 に答える
54

「true を返す」代わりに、「noop」または null ユーティリティ ( POSIX 仕様で参照):を使用して、単に「何もしない」こともできます。数文字節約できます。:)

#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
于 2016-11-17T08:51:41.420 に答える
8

上からの簡単な解決策をありがとう:

<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ます。

于 2020-05-20T13:28:21.133 に答える