Мне нужно выполнить ряд командных командных оболочек из не-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
?