SIGPIPE 이후 잠재적인 오류

SIGPIPE 이후 잠재적인 오류

CI 서버에서 bash 스크립트를 실행할 때 오류 코드 141이 발생하지만 로컬에서 재현할 수 없습니다.

PIPEFAIL몇 번 검색해 본 결과 오류 141이 a를 의미하는 것처럼 들리는데

set -o pipefail

스크립트 상단에 있습니다.

그런데 파이프라인이 실패하게 되는 근본적인 오류 코드가 무엇인지 알고 싶습니다. 실패한 명령의 오류 코드를 추출하는 방법이 있습니까? 아니면 파이프를 사용하지 않고 이를 달성하려면 스크립트를 재구성해야 합니까?

답변1

bash이므로 PIPESTATUS를 고려할 수 있습니다.

command exit 1 | command exit 2 | command exit 3 | foobar; declare -p PIPESTATUS

찾을 수 없음 경고 후에 foobar다음 값을 얻어야 합니다.PIPESTATUS

 declare -a PIPESTATUS=([0]="1" [1]="2" [2]="3" [3]="127")

답변2

$?141은 프로세스가 신호 13으로 종료될 때 얻은 값입니다. Linux에서는 다음과 같습니다 SIGPIPE(참조신호(7)). 이것은 프로세스가 리더가 없는 파이프에 쓰려고 할 때 얻게 되는 것입니다. 일반적으로 파이프의 반환 상태는 그 안에 있는 마지막 프로세스의 상태이기 때문에 이 반환 값을 볼 수 없습니다. 그러나 pipefail설정을 사용하면 Bash는 마지막을 반환합니다.실패하다값.

$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
0

$ set -o pipefail
$ (echo x; sleep 1; echo y) | head -1 >/dev/null ; echo $?
141

관련 정보