set -eo pipefail difiere en ksh y bash

Me gustaría terminar un script en cualquier falla, incluso dentro de una tubería. En bash, puede set -eo pipefail, pero esto no funciona en ksh.

Ejemplo:

# 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 

¿Por qué ksh no se cerraría en este caso?

Editar: Añadiendo otra prueba

He comparado esta con otra shells y obtengo resultados diferentes:

-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 

Aparte de un error en ksh, no entiendo qué podría causar este comportamiento. Según 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. 

Comentarios

  • Puede usar una versión cuestionable de ksh93. Funciona como se esperaba con ksh93 t + de 2010 de OpenSolaris y BTW: este es el ksh93 más rápido jamás visto.
  • OpenBSD ksh93 u + imprime el mensaje hecho, fwiw.
  • @Shawn lo cual no es sorprendente, ya que ' es la misma versión que el OP ' s 😉
  • También probé en Linux. Versión ... 2020.0.0 tiene el mismo comportamiento. Actualizaré la pregunta con otro te st

Respuesta

Parece una regresión introducida por ksh93u +. ksh93u funcionó como se esperaba en ese sentido (y como zsh, bash, mksh, yash y busybox sh).

Acabo de plantear el problema en https://github.com/ksh93/ksh/issues/121

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *