set -eopipefailはkshとbashで異なります

パイプ内を含むすべての障害でスクリプトを終了したいと思います。 bashではset -eo pipefailを実行できますが、これはkshでは機能しません。

例:

# 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 

この場合、kshが終了しないのはなぜですか?

編集:別のテストを追加する

これを他のテストと比較しましたシェルと異なる結果が得られています:

-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 

kshのバグ以外に、この動作の原因がわかりません。mankshによると:

-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. 

コメント

  • 疑わしいバージョンのksh93を使用できます。ksh93t+で期待どおりに機能します2010年からOpenSolarisとBTWから:これはこれまでに見られた中で最速のksh93です。
  • OpenBSD ksh93 u +は完了メッセージfwiwを出力します。
  • @Shawnこれは驚くことではありません。'はOPと同じバージョンです' s 😉
  • Linuxでも試してみました。バージョン... 2020.0.0の動作は同じです。質問を別のteで更新しますst

回答

ksh93u +によって導入された回帰のようです。 ksh93uは、その点で期待どおりに機能しました(zsh、bash、mksh、yash、busybox shなど)。

https://github.com/ksh93/ksh/issues/121

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です