set -eo pipefail diffère sur ksh et bash

Je voudrais terminer un script en cas de panne y compris à lintérieur dun tube. Dans bash, vous pouvez set -eo pipefail, mais cela ne fonctionne pas dans ksh.

Exemple:

# 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 

Pourquoi ksh ne se ferme-t-il pas dans ce cas?

Edit: Ajout dun autre test

Jai comparé ceci à dautres shells et jobtiens des résultats différents:

-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 

À part un bogue dans ksh, je ne comprends pas ce qui pourrait causer ce comportement. Selon 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. 

Commentaires

  • Vous pouvez utiliser une version douteuse de ksh93. Cela fonctionne comme prévu avec le ksh93 t + à partir de 2010 dOpenSolaris et BTW: cest le ksh93 le plus rapide jamais vu.
  • OpenBSD ksh93 u + imprime le message done, fwiw.
  • @Shawn ce qui nest pas surprenant, car il ' est la même version que lOP ' s 😉
  • Je viens dessayer aussi sous Linux. Version ... 2020.0.0 a le même comportement. Je mettrai à jour la question avec un autre te st

Réponse

Cela ressemble à une régression introduite par ksh93u +. ksh93u a fonctionné comme prévu à cet égard (et comme zsh, bash, mksh, yash et busybox sh).

Je viens de soulever le problème à https://github.com/ksh93/ksh/issues/121

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *