set -eo pipefail er forskellig på ksh og bash

Jeg vil gerne afslutte et script på enhver fejl inklusive inde 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 ville ksh ikke afslutte i dette tilfælde?

Rediger: Tilføjelse af endnu en test

Jeg sammenlignede dette med andre skal og får forskellige 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 

Bortset fra en fejl i ksh forstår jeg ikke, hvad der kunne forårsage denne adfærd. Ifølge 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. 

Kommentarer

  • Du kan bruge en tvivlsom version af ksh93. Det fungerer som forventet med ksh93 t + fra 2010 fra OpenSolaris og BTW: dette er den hurtigste ksh93, der nogensinde er set.
  • OpenBSD ksh93 u + udskriver den udførte besked, fwiw.
  • @Shawn, hvilket ikke er overraskende, da det ' er den samme version som OP ' s 😉
  • Jeg prøvede lige på linux også. Version ... 2020.0.0 har samme adfærd. Jeg opdaterer spørgsmålet med en anden te st

Svar

Det ligner en regression introduceret af ksh93u +. ksh93u fungerede som forventet i den henseende (og som zsh, bash, mksh, yash og busybox sh).

Jeg har lige rejst spørgsmålet på https://github.com/ksh93/ksh/issues/121

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *