set -eo pipefail differisce su ksh e bash

Vorrei terminare uno script su qualsiasi errore, incluso allinterno di un pipe. In bash, puoi set -eo pipefail, ma questo non funziona in ksh.

Esempio:

# 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 

Perché ksh non dovrebbe uscire in questo caso?

Modifica: aggiunta di un altro test

Lho confrontato con altri shell e sto ottenendo risultati diversi:

-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 

A parte un bug in ksh, non capisco cosa potrebbe causare questo comportamento. Secondo 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. 

Commenti

  • Puoi utilizzare una versione discutibile di ksh93. Funziona come previsto con ksh93 t + dal 2010 da OpenSolaris e BTW: questo è il ksh93 più veloce mai visto.
  • OpenBSD ksh93 u + stampa il messaggio fatto, fwiw.
  • @Shawn che non è sorprendente, dato che ' è la stessa versione dellOP ' s 😉
  • Ho appena provato anche su Linux. Versione ... 2020.0.0 ha lo stesso comportamento. Aggiornerò la domanda con un altro te st

Risposta

Sembra una regressione introdotta da ksh93u +. ksh93u ha funzionato come previsto a tale riguardo (e come zsh, bash, mksh, yash e busybox sh).

Ho appena sollevato il problema a https://github.com/ksh93/ksh/issues/121

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *