Z příkazového řádku Bash byste museli vyvolat subshell, abyste se vyhnuli pipefail nastavuje se později:
$ (set -o pipefail && command1 | command2 | command3)
To by omezilo účinek pipefail možnost do podshell vytvořeného pomocí závorek (...) .
Skutečný příklad:
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
Pokud použijete explicitní volání shellu s -c nepotřebujete subshell, ani s bash nebo s sh alias na 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
Od vašeho sh nepřijímá pipefail možnost, musel bych předpokládat, že se jedná buď o nějakou starší nebo upravenou verzi bash - nebo že je to vlastně úplně nějaká jiná skořápka.
Nejste si jisti, proč to nebylo uvedeno výše, ale je možné explicitně zrušit nastavení pipefail pomocí set +o pipefail .
set -o pipefail
command1 | command2 | command3
set +o pipefail
Pokud spouštíte fragment a nejste si jisti pipefail již nastaveno, můžete jej použít s podshellem, jak bylo dříve navrženo:
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )