Мне нужно выполнить ряд командных командных оболочек из не-BASH-скрипта (а именно PHP-скрипта), например:
command1 | command2 | command3
так что, если происходит command1сбой с ненулевым кодом выхода, каждая другая команда тоже не выполняется. Пока что я придумал:
set -o pipefail && command1 | command2 | command3
Но даже при том, что это работает отлично от терминала, это производит это, если выполнено от сценария:
sh: 1: set: недопустимый параметр -o pipefail
/bin/sh set -o pipefailон говорит /bin/sh: 0: Can't open set(то же самое с sudo). Надеюсь, я проверил это правильно. Система Ubuntu 12.
/bin/sh -c "set -o pipefail"; как бы то ни было, оболочка пыталась выполнить скрипт в текущем каталоге setи не нашла его.
/bin/sh -c "set -o pipefail"не работает, но bash -c "set -o pipefail"работает.
/bin/shкоторый не распознает set -o pipefail. Следовательно, вам нужно убедиться, что скрипт запускается /bin/bashвместо /bin/sh. Или, если вы уверены, смелый - и, вероятно, безрассудный - смените /bin/shего на ссылку или копию /bin/bashвместо того, с какой оболочкой он связан или является копией. Если вы уверены, что /bin/shэто так bash, то вы используете поведение, которое bashне раскрывается при запуске как /bin/sh; использовать bashкак bash.
/bin/shне нравитсяset -o pipefail. Это на самом делеbashзамаскированный, или это другая оболочка? Когдаbashзапускается как/bin/sh, он принимаетset -o pipefail?