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.0hat 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