Desde la línea de comando de Bash, necesitaría invocar una subcapa para evitar pipefail se establece después:
$ (set -o pipefail && command1 | command2 | command3)
Esto limitaría el efecto del pipefail opción a la subcapa creada por los paréntesis (...) .
Un ejemplo real:
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
Si usa una llamada de shell explícita con el -c opción no necesita una subcapa, ya sea con bash o con un sh alias para 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
Desde tu sh no acepta el pipefail opción, tendría que asumir que es una versión más antigua o modificada de bash - o que en realidad es otro caparazón por completo.
No estoy seguro de por qué no se mencionó anteriormente, pero es posible desactivar explícitamente pipefail , usando set +o pipefail .
set -o pipefail
command1 | command2 | command3
set +o pipefail
Si está ejecutando un fragmento y no está seguro del pipefail ya configurado, puede usar esto con el subshell como se sugirió anteriormente:
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )