Ich muss eine Reihe von Pipe-Shell-Befehlen von einem Nicht-BASH-Skript (nämlich PHP-Skript) wie folgt ausführen:
command1 | command2 | command3
Wenn also ein command1Fehler mit einem Exit-Code ungleich Null auftritt, schlägt auch jeder andere Befehl fehl. Bisher habe ich mir Folgendes ausgedacht:
set -o pipefail && command1 | command2 | command3
Aber obwohl es vom Terminal aus gut läuft, erzeugt es dies, wenn es vom Skript ausgeführt wird:
sh: 1: set: Unzulässige Option -o pipefail
/bin/sh set -o pipefailheißt es /bin/sh: 0: Can't open set(dasselbe mit sudo). Hoffe ich habe es richtig getestet. Das System ist Ubuntu 12.
/bin/sh -c "set -o pipefail"; Die Shell hat versucht, ein Skript im aktuellen Verzeichnis auszuführen, setund es wurde nicht gefunden.
/bin/sh -c "set -o pipefail"funktioniert jedoch bash -c "set -o pipefail"nicht.
/bin/shdem es nicht erkannt wird set -o pipefail. Folglich müssen Sie sicherstellen, dass das Skript /bin/bashvon ausgeführt wird /bin/sh. Oder, wenn Sie zuversichtlich sind, mutig - und wahrscheinlich tollkühn - ändern /bin/sh, um eine Verknüpfung zu oder eine Kopie von zu sein, /bin/bashanstatt der Shell, mit der sie derzeit verknüpft ist, oder einer Kopie von. Wenn Sie sicher sind, dass dies der Fall /bin/shist bash, verwenden Sie ein Verhalten, das bashbeim Ausführen als nicht verfügbar gemacht wird /bin/sh. Verwenden Sie bashals bash.
/bin/shnicht gefälltset -o pipefail. Ist es tatsächlichbashverschleiert oder ist es eine andere Hülle? Wannbashwird ausgeführt als/bin/sh, akzeptiert esset -o pipefail?