Dalla riga di comando di Bash dovresti invocare una subshell per evitare pipefail
essere impostato in seguito:
$ (set -o pipefail && command1 | command2 | command3)
Ciò limiterebbe l'effetto del pipefail
opzione alla subshell creata dalle parentesi (...)
.
Un esempio reale:
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
Se usi una chiamata shell esplicita con -c
opzione non hai bisogno di una subshell, neanche con bash
o con un sh
alias di 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
Dal tuo sh
non accetta pipefail
opzione, dovrei presumere che si tratti di una versione precedente o modificata di bash
- o che in realtà è completamente un'altra shell.
Non sono sicuro del motivo per cui non è stato menzionato sopra, ma è possibile annullare l'impostazione esplicita di pipefail
, utilizzando set +o pipefail
.
set -o pipefail
command1 | command2 | command3
set +o pipefail
Se stai eseguendo un frammento e non sei sicuro del pipefail
già impostato, puoi usarlo con la subshell come suggerito in precedenza:
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )