pipefail
を回避するには、Bash コマンド ラインからサブシェルを呼び出す必要があります。 後で設定:
$ (set -o pipefail && command1 | command2 | command3)
これにより、 pipefail
の効果が制限されます 括弧 (...)
で作成されるサブシェルのオプション .
実際の例:
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
-c
で明示的なシェル呼び出しを使用する場合 bash
を使用しても、サブシェルは必要ありません。 または sh
bash
へのエイリアス :
$ bash -c "set -o pipefail && false | true" && echo pipefail inactive || echo pipefail active
pipefail active
$ sh -c "set -o pipefail && false | true" && echo pipefail inactive || echo pipefail active
pipefail active
sh
以降 pipefail
を受け入れません オプション、私はそれが bash
の古いバージョンまたは変更されたバージョンのいずれかであると想定する必要があります - または、実際には完全に別のシェルです。
上記に言及しなかった理由は不明ですが、pipefail
を明示的に設定解除することは可能です。 、 set +o pipefail
を使用 .
set -o pipefail
command1 | command2 | command3
set +o pipefail
フラグメントを実行していて、pipefail
について不明な場合 すでに設定されている場合は、以前に提案されたようにサブシェルでこれを使用できます:
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )