20

bashpipefailオプションを ( 経由でset -o pipefail) 設定すると、パイプの任意のステップでゼロ以外のエラーが発生した場合に、スクリプトが失敗するようになります。

ただし、SIGPIPE存在しないパイプにデータが書き込まれるというエラー (エラー コード 141) が発生しています。

エラーを無視するように bash を設定する方法はありますSIGPIPEか、またはすべてのエラーステータスコードを処理するエラーハンドラーを作成する方法がありますが、たとえば 0 と 141 はありますか?

たとえば、Python では、以下を追加できます。

signal.signal(signal.SIGPIPE, signal.SIG_DFL) 

エラーにデフォルトの動作を適用するにはSIGPIPE: エラーを無視します ( http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-06/3823.htmlを参照)。

bashで利用できる同様のオプションはありますか?

4

3 に答える 3

6

スクリプト全体でこれを行う方法を私が知っているわけではありません。子プロセスが別の理由で 141 を返さなかったことを知る方法がないため、一般的に危険です。

ただし、これはコマンドごとに行うことができます。オペレーターは||、最初のコマンドによって返されるエラーを抑制するため、次のようなことができます。

set -e -o pipefail
(cat /dev/urandom || true) | head -c 10 | base64
echo 'cat exited with SIGPIPE, but we still got here!'
于 2015-09-14T20:38:08.297 に答える