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 command1
Fehler 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 pipefail
heiß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, set
und es wurde nicht gefunden.
/bin/sh -c "set -o pipefail"
funktioniert jedoch bash -c "set -o pipefail"
nicht.
/bin/sh
dem es nicht erkannt wird set -o pipefail
. Folglich müssen Sie sicherstellen, dass das Skript /bin/bash
von 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/bash
anstatt der Shell, mit der sie derzeit verknüpft ist, oder einer Kopie von. Wenn Sie sicher sind, dass dies der Fall /bin/sh
ist bash
, verwenden Sie ein Verhalten, das bash
beim Ausführen als nicht verfügbar gemacht wird /bin/sh
. Verwenden Sie bash
als bash
.
/bin/sh
nicht gefälltset -o pipefail
. Ist es tatsächlichbash
verschleiert oder ist es eine andere Hülle? Wannbash
wird ausgeführt als/bin/sh
, akzeptiert esset -o pipefail
?