set -eo pipefail eroaa ksh: ssä ja bashissa

Haluaisin lopettaa komentosarjan kaikista vikoista, myös putken sisällä. Bashissa voit set -eo pipefail, mutta tämä ei toimi ksh: ssä.

Esimerkki:

# 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 

Miksi ksh ei poistu tässä tapauksessa?

Muokkaa: Lisää uusi testi

Verroin tätä muihin kuoret ja saan erilaisia tuloksia:

-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 

Lukuun ottamatta ksh: n virhettä, en ymmärrä mikä voi aiheuttaa tämän käyttäytymisen. Ihmisen mukaan 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. 

Kommentit

  • Voit käyttää ksh93: n kyseenalaista versiota. Se toimii odotetusti ksh93 t +: lla vuodesta 2010 OpenSolarisilta ja BTW: ltä: tämä on nopein koskaan nähty ksh93.
  • OpenBSD ksh93 u + tulostaa tehdyn viestin, fwiw.
  • @Shawn, mikä ei ole yllättävää, koska se ' s sama versio kuin OP ' s 😉
  • Yritin vain Linuxia. Versio ... 2020.0.0 käyttäytyy samalla tavalla. Päivitän kysymyksen toisella te st

Vastaus

Se näyttää olevan regressio, jonka ksh93u + on tuonut esiin. ksh93u toimi tältä osin odotetusti (ja kuten zsh, bash, mksh, yash ja busybox sh).

Olen juuri ottanut asian esiin osoitteessa https://github.com/ksh93/ksh/issues/121

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *