Ich möchte ein Skript bei jedem Fehler beenden, auch innerhalb einer Pipe. In Bash können Sie set -eo pipefail
verwenden, dies funktioniert jedoch nicht in ksh.
Beispiel:
# x set -eo pipefail false | true echo "done: $?" # reached in ksh, unexpected false echo "done2" # not reached in either shell, as expected
bash x # prints nothing, as expected ksh x # done: 1 ksh --version # ... 93u+ 2012-08-01
Warum sollte ksh in diesem Fall nicht beendet werden?
Bearbeiten: Hinzufügen eines weiteren Tests
Ich habe dies mit einem anderen verglichen Muscheln und erhalte unterschiedliche Ergebnisse:
-bash-5.0$ zsh -c "set -eo pipefail; false | true; exit 2" ; echo $? 1 -bash-5.0$ ksh -c "set -eo pipefail; false | true; exit 2"; echo $? 2 -bash-5.0$ bash -c "set -eo pipefail; false | true; exit 2" ; echo $? 1
Abgesehen von einem Fehler in ksh verstehe ich nicht, was dieses Verhalten verursachen könnte. Laut man ksh:
-e Unless contained in a ⎪⎪ or && command, or the command following an if while or until command or in the pipeline following !, if a command has a non-zero exit # Pipeline does not follow ! status, execute the ERR trap, if set, and exit. This # Pipeline has a non-zero exit status mode is disabled while reading profiles. pipefail A pipeline will not complete until all components of the pipeline have completed, and the return value will be the value of the last non-zero command to fail or zero if no command has failed.
Kommentare
- Sie können eine fragwürdige Version von ksh93 verwenden. Sie funktioniert wie erwartet mit dem ksh93 t + ab 2010 von OpenSolaris und BTW: Dies ist das schnellste ksh93, das jemals gesehen wurde.
- OpenBSD ksh93 u + druckt die fertige Nachricht, fwiw.
- @Shawn, was nicht überraschend ist, da es ' ist dieselbe Version wie die OP ' s 😉
- Ich habe gerade auch Linux ausprobiert. Version
... 2020.0.0
hat das gleiche Verhalten. Ich werde die Frage mit einem anderen te aktualisieren st
Antwort
Es sieht aus wie eine von ksh93u + eingeführte Regression. ksh93u hat in dieser Hinsicht wie erwartet funktioniert (und wie zsh, bash, mksh, yash und Busybox sh).
Ich habe das Problem gerade bei https://github.com/ksh93/ksh/issues/121