set -eo pipefail verschilt op ksh en bash

Ik zou graag een script willen beëindigen bij elke fout, ook in een pipe. In bash kun je set -eo pipefail, maar dit werkt niet in ksh.

Voorbeeld:

# 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 

Waarom zou ksh in dit geval niet afsluiten?

Bewerken: nog een test toevoegen

Ik heb dit vergeleken met andere shells en krijg verschillende resultaten:

-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 

Behalve een bug in ksh, begrijp ik niet wat dit gedrag zou kunnen veroorzaken. Volgens 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. 

Reacties

  • Je kunt een twijfelachtige versie van ksh93 gebruiken. Het werkt zoals verwacht met de ksh93 t + uit 2010 van OpenSolaris en BTW: dit is de snelste ksh93 ooit gezien.
  • OpenBSD ksh93 u + drukt het voltooide bericht af, fwiw.
  • @Shawn wat niet verrassend is, aangezien het ' s dezelfde versie als het OP ' s 😉
  • Ik heb het net ook op linux geprobeerd. div id = “dca81a5131″>

heeft hetzelfde gedrag. Ik zal de vraag updaten met een andere te st

Answer

Het lijkt op een regressie die is geïntroduceerd door ksh93u +. ksh93u werkte zoals verwacht in dat opzicht (en net als zsh, bash, mksh, yash en busybox sh).

Ik heb het probleem zojuist ter sprake gebracht op https://github.com/ksh93/ksh/issues/121

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *