set -eo pipefail skiljer sig åt på ksh och bash

Jag skulle vilja avsluta ett skript på alla fel inklusive inuti ett rör. I bash kan du set -eo pipefail, men detta fungerar inte i ksh.

Exempel:

# 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 

Varför skulle ksh inte avslutas i det här fallet?

Redigera: Lägga till ett nytt test

Jag jämförde detta med andra skal och får olika resultat:

-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 

Förutom ett fel i ksh förstår jag inte vad som kan orsaka detta beteende. Enligt 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 använda en tvivelaktig version av ksh93. Det fungerar som förväntat med ksh93 t + från 2010 från OpenSolaris och BTW: detta är den snabbaste ksh93 som någonsin sett.
  • OpenBSD ksh93 u + skriver ut det färdiga meddelandet, fwiw.
  • @Shawn vilket inte är förvånande, eftersom det ' är samma version som OP ' s 😉
  • Jag försökte bara på Linux också. Version ... 2020.0.0 har samma beteende. Jag kommer att uppdatera frågan med en annan te st

Svar

Det ser ut som en regression införd av ksh93u +. ksh93u fungerade som förväntat i det avseendet (och som zsh, bash, mksh, yash och busybox sh).

Jag har just tagit upp frågan på https://github.com/ksh93/ksh/issues/121

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *