Jeg vil gjerne avslutte et skript på enhver feil inkludert i et rør. I bash kan du set -eo pipefail
, men dette fungerer ikke i ksh.
Eksempel:
# 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
Hvorfor skulle ikke ksh gå ut i dette tilfellet?
Edit: Legge til en ny test
Jeg sammenlignet dette med andre skjell og får forskjellige resultater:
-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
Annet enn en feil i ksh, forstår jeg ikke hva som kan forårsake denne oppførselen. Ifølge mann 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.
Kommentarer
Svar
Det ser ut som en regresjon introdusert av ksh93u +. ksh93u fungerte som forventet i den forbindelse (og som zsh, bash, mksh, yash og busybox sh).
Jeg har nettopp tatt opp problemet på https://github.com/ksh93/ksh/issues/121
... 2020.0.0
har samme oppførsel. Jeg vil oppdatere spørsmålet med en annen te st