set -eo 파이프라인fail은 ksh와 bash에서 다릅니다.

set -eo 파이프라인fail은 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의 버그 외에 이 동작의 원인이 무엇인지 이해하지 못합니다. 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.

답변1

ksh93u+에 의해 도입된 회귀처럼 보입니다. ksh93u는 이와 관련하여 예상대로 작동합니다(zsh, bash, mksh, yash 및 busybox sh와 함께).

방금 이런 질문을 했어요https://github.com/ksh93/ksh/issues/121

이제 고정됨https://github.com/ksh93/ksh/commit/c049eec854d506ad6110eb50c769b10224c60075, v1.0.0-beta.1부터 포함됨

관련 정보