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 pipefailil 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é setet il ne l'a pas trouvé.
/bin/sh -c "set -o pipefail"ne fonctionne pas, cependant bash -c "set -o pipefail".
/bin/shqui ne reconnaît pas set -o pipefail. Par conséquent, vous devrez vous assurer que le script est exécuté par /bin/bashau lieu de /bin/sh. Ou, si vous êtes confiant, courageux - et probablement imprudent - changez /bin/shpour être un lien ou une copie de, /bin/bashau lieu du shell auquel il est actuellement lié ou d'une copie. Si vous êtes sûr que /bin/shest bash, alors vous utilisez un comportement qui bashn'expose pas lorsqu'il est exécuté comme /bin/sh; utiliser bashcomme bash.
/bin/shn'aime passet -o pipefail. Est-ce en faitbashdéguisé ou s'agit-il d'une coquille différente? Quandbashest-il exécuté comme/bin/sh, accepte-set -o pipefailt- il ?