J'ai besoin d'exécuter un certain nombre de commandes shell canalisées à partir d'un script non BASH (à savoir un script PHP) comme ceux-ci:
command1 | command2 | command3
de sorte qu'en cas d' command1
échec avec un code de sortie différent de zéro, chaque autre commande échoue également. Jusqu'à présent, ce que j'ai trouvé est:
set -o pipefail && command1 | command2 | command3
Mais même s'il fonctionne correctement depuis le terminal, il produit ceci s'il est exécuté à partir du script:
sh: 1: set: option illégale -o pipefail
/bin/sh set -o pipefail
il dit /bin/sh: 0: Can't open set
(même chose avec sudo
). J'espère que je l'ai testé correctement. Le système est Ubuntu 12.
/bin/sh -c "set -o pipefail"
; tel qu'il était, le shell essayait d'exécuter un script dans le répertoire courant appelé set
et il ne l'a pas trouvé.
/bin/sh -c "set -o pipefail"
ne fonctionne pas, cependant bash -c "set -o pipefail"
.
/bin/sh
qui ne reconnaît pas set -o pipefail
. Par conséquent, vous devrez vous assurer que le script est exécuté par /bin/bash
au lieu de /bin/sh
. Ou, si vous êtes confiant, courageux - et probablement imprudent - changez /bin/sh
pour être un lien ou une copie de, /bin/bash
au lieu du shell auquel il est actuellement lié ou d'une copie. Si vous êtes sûr que /bin/sh
est bash
, alors vous utilisez un comportement qui bash
n'expose pas lorsqu'il est exécuté comme /bin/sh
; utiliser bash
comme bash
.
/bin/sh
n'aime passet -o pipefail
. Est-ce en faitbash
déguisé ou s'agit-il d'une coquille différente? Quandbash
est-il exécuté comme/bin/sh
, accepte-set -o pipefail
t- il ?