À partir de la ligne de commande Bash, vous devrez invoquer un sous-shell pour éviter pipefail
être défini par la suite :
$ (set -o pipefail && command1 | command2 | command3)
Cela limiterait l'effet du pipefail
option au sous-shell créé par les parenthèses (...)
.
Un exemple concret :
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
Si vous utilisez un appel shell explicite avec le -c
option vous n'avez pas besoin d'un sous-shell, soit avec bash
ou avec un sh
alias vers 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
Depuis votre sh
n'accepte pas le pipefail
option, je devrais supposer qu'il s'agit d'une version plus ancienne ou modifiée de bash
- ou qu'il s'agit en fait d'un autre shell complètement.
Je ne sais pas pourquoi cela n'a pas été mentionné ci-dessus, mais il est possible de désactiver explicitement pipefail
, en utilisant set +o pipefail
.
set -o pipefail
command1 | command2 | command3
set +o pipefail
Si vous exécutez un fragment et que vous n'êtes pas sûr du pipefail
déjà défini, vous pouvez l'utiliser avec le sous-shell comme suggéré précédemment :
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )