파이프 내부를 포함하여 모든 실패시 스크립트를 종료하고 싶습니다. 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와 동일한 버전입니다. ';-)
... 2020.0.0
의 동작은 동일합니다. 다른 질문으로 질문을 업데이트하겠습니다. st Answer
ksh93u +에 의해 도입 된 회귀처럼 보입니다. ksh93u는 이와 관련하여 예상대로 작동했습니다 (zsh, bash, mksh, yash 및 busybox sh처럼).