파이프를 사용할 때 두 번째 명령의 첫 번째 명령에서 반환 코드 가져오기

파이프를 사용할 때 두 번째 명령의 첫 번째 명령에서 반환 코드 가져오기

한 명령의 출력 및 반환 코드를 다른 명령으로 파이프하고 싶습니다.

somecommand | anothercommand.sh

anothercommand.sh는 somecommand의 출력을 읽을 수 있지만 스크립트는 반환 코드를 어떻게 읽습니까 somecommand?

$PIPESTATUSanotherstatus.sh에는 이전 명령에 대한 정보가 없습니다(예상된 내용임).

답변1

{ somecommand; echo "STATUS:${?}"; } | anothercommand.sh

파이프라인의 마지막 데이터 줄로 상태를 보냅니다. 따라서 이전 데이터를 모두 읽을 때까지 사용할 수 없습니다. 상태는 나쁜 경우에만 전송될 수 있으므로 "취소" 연산자 역할을 합니다.

파이프의 데이터 순서가 중요하지 않은 경우 tac상태가 먼저 나오도록 데이터를 먼저 넣거나 메모리에 모두 버퍼링하거나(아마도 awk 배열로) Stephen이 제안한 대로 파일을 사용할 수 있습니다. 용량.

성공한 후에만 데이터를 생성 하면 somecommand어쨌든 잘못된 상태 줄이 먼저 (그 자체로) 표시됩니다. 실제로 "성공"은 "내가 기대했던 데이터를 얻었습니까?"로 측정할 수 있는 경우가 많습니다.

또한 stderr를 2>&1파이프 데이터로 리디렉션하고 오류 메시지를 찾을 수도 있습니다(유효한 데이터와 쉽게 구별할 수 있는 경우).

답변2

파이프라인의 명령은 병렬로 실행될 수 있으므로 파이프라인에서는 이 작업을 수행할 수 없습니다. anothercommand.sh시작 시 somecommand아직 완료되지 않았으며 종료 코드를 알 수 없습니다.

이 정보가 필요한 경우 파이프라인을 분할하고 실행을 직렬화해야 합니다.

somecommand > tmpfile
anothercommand.sh $? < tmpfile

(적절한 건설로 tmpfile,예를 들어사용 mktemp. )

관련 정보