set -eo pipefail er forskjellig på ksh og bash

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

  • Du kan bruke en tvilsom versjon av ksh93. Det fungerer som forventet med ksh93 t + fra 2010 fra OpenSolaris og BTW: dette er den raskeste ksh93 som noensinne er sett.
  • OpenBSD ksh93 u + skriver ut den ferdige meldingen, fwiw.
  • @Shawn som ikke er overraskende, siden den ' er samme versjon som OP ' s 😉
  • Jeg prøvde bare på linux også. Versjon ... 2020.0.0 har samme oppførsel. Jeg vil oppdatere spørsmålet med en annen te st

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *