set -eo pipefail difere em ksh e bash

Eu gostaria de terminar um script em qualquer falha, incluindo dentro de um tubo. No bash, você pode set -eo pipefail, mas isso não funciona no ksh.

Exemplo:

# 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 que o ksh não sairia neste caso?

Editar: Adicionando outro teste

Eu comparei isso com outro shells e estou obtendo 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 

Além de um bug no ksh, não entendo o que pode causar esse comportamento. De acordo com 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. 

Comentários

  • Você pode usar uma versão questionável de ksh93. Funciona como esperado com o ksh93 t + de 2010 da OpenSolaris e BTW: este é o ksh93 mais rápido já visto.
  • O OpenBSD ksh93 u + imprime a mensagem concluída, fwiw.
  • @Shawn, o que não é surpreendente, já que ' é a mesma versão do OP ' s 😉
  • Eu também tentei no Linux. Versão ... 2020.0.0 tem o mesmo comportamento. Vou atualizar a pergunta com outro te st

Resposta

Parece uma regressão introduzida por ksh93u +. ksh93u funcionou conforme o esperado nesse sentido (e como zsh, bash, mksh, yash e busybox sh).

Acabei de levantar o problema em https://github.com/ksh93/ksh/issues/121

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *