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 )