set -eo pipefail은 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. 

댓글

  • 의심스러운 버전의 ksh93을 사용할 수 있습니다. ksh93 t +에서 예상대로 작동합니다. 2010 년부터 OpenSolaris 및 BTW에서 : 이것은 지금까지 본 것 중 가장 빠른 ksh93입니다.
  • OpenBSD ksh93 u +는 완료된 메시지 fwiw를 인쇄합니다.
  • @Shawn 이것은 놀라운 일이 아닙니다. id = “be9f88a3da”>

OP와 동일한 버전입니다. ';-)

  • 저는 방금 Linux에서도 시도했습니다. 버전 ... 2020.0.0의 동작은 동일합니다. 다른 질문으로 질문을 업데이트하겠습니다. st
  • Answer

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

    저는 방금 에서 문제를 제기했습니다. div id = “4e7b1078ae”>

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다