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 )