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 )