상태 141로 설정된 파이프라인 출력의 첫 번째 줄을 가져옵니다. 이는 set -eo Pipelinefail을 사용하여 bash 스크립트에 실패합니다.

상태 141로 설정된 파이프라인 출력의 첫 번째 줄을 가져옵니다. 이는 set -eo Pipelinefail을 사용하여 bash 스크립트에 실패합니다.

명령을 실행하는 bash 스크립트가 있는데 그 스크립트에서 첫 번째 출력 줄을 가져오고 싶습니다.

분명한 대답은 입니다 some_command | head -1. 그렇죠? 글쎄, 이것은 99%의 경우 작동하지만 출력이 충분히 크면 내가 set -eo pipefail맨 위에 있기 때문에 종료 코드 141과 함께 실패하는 경우가 있습니다. awk '{ print; exit; }'더 많은 경우에 작동하지만 출력이 충분히 크면 여전히 실패합니다. 이 간단한 스크립트는 문제를 재현합니다.

#!/bin/bash
set -eo pipefail
seq 1 100000 | awk '{ print; exit; }' | tee
echo "This is not printed"

이것은 "1"을 인쇄하지만 "This is not print"는 인쇄하지 않습니다. 내가 이해한 바로는 awk(또는 head)가 seq명령을 입력하기 전에 종료되므로(여기) 명령 입력이 SIGPIPE(141)와 함께 실패합니다. +e관련 명령 앞에 종료 코드를 설정하고 수동으로 확인하여 이 문제를 확실히 해결할 수 있지만 더 좋은 방법이 있습니까?

-o pipefail경로의 명령이 실제로 실패하면 스크립트가 실패하기를 원하기 때문에 실제로 삭제하고 싶지 않습니다 .

답변1

sed -n 1p일하다!

모든 입력을 읽는 것처럼 보이므로 SIGPIPE를 피합니다. seq 1 10000000 | sed -n 1p지연이 2초 미만 이더라도 실제 입력은 10M 라인보다 훨씬 적습니다.

Jonathan Leffler의 공로:https://stackoverflow.com/a/1429628/1536933- 이 답변은 많은 찬사를 받을 가치가 있습니다!

관련 정보