xargs 및 zcat: 오류 무시

xargs 및 zcat: 오류 무시

내가 가지고 있다고 가정하십시오 :

** EDIT TO HAVE CLOSER CORRESPONDENCE TO ACTUAL USAGE **

find ... -regex ... | head -n 1 | xargs -I {} zcat {} | head -n 1
# next, I do some other things

이제 모든 것이 제대로 작동합니다. 그러나 이 xargs -I {} zcat {}명령은 다음 오류를 발생시킵니다.

xargs: zcat: terminated by signal 13

내가 하려는 일의 목적상 무시할 수 있는 것입니다. 그러나 코드를 실행하고 에 파이프하면 less해당 xargs: zcat: terminated by signal 13명령문이 첫 번째 줄이 됩니다. 이는 바람직하지 않습니다. 이 경고/오류가 아닌 오류를 억제하거나 포착할 수 있는 방법이 있습니까?

답변1

오류는 전송된 신호를 zcat받기 때문에 발생합니다 . PIPE이는 두 번째가 실행되고(그 이후에는 첫 번째를 제외한 각 파일에 대해 한 번씩) 종료된 후 zcat파이프를 통해 쓰기를 시도하기 때문에 발생합니다 (첫 번째 줄 출력 작업이 완료되었기 때문에). .headhead

생성되는 모든 데이터를 읽으면 이 특정 오류가 발생하는 것을 방지할 수 있습니다 zcat. 다음 중 하나를 통해 이 작업을 수행할 수 있습니다.

ls files/* | xargs -I {} zcat {} | { head -n 1; cat >/dev/null; }

또는

ls files/* | xargs -I {} zcat {} | sed -n 1p

또는

ls files/* | xargs -I {} zcat {} | awk 'NR == 1'

아니면 참조하세요에두아르도 트라파니의 답변어떻게 하면 간단하게무시하다오류.

이를 수행하는 또 다른 방법은 첫 번째 파일의 압축을 푸는 것입니다.

set -- files/*
zcat "$1" | head -n 1

이는 디렉터리의 모든 단일 파일에 대해 실행되지 않고 한 번만 실행되므로 PIPE신호를 트리거하지 않습니다 . zcat이는 유효한 파일 이름(예: 줄 바꿈이 포함된 이름)에 대처할 수 있다는 추가적인 이점이 있습니다.

답변2

메시지가 첫 번째 줄로 표시되더라도 표준 출력에 기록되지 않고 표준 오류에 기록됩니다.

따라서 다음과 같이 작동합니다.

ls files/* | xargs -I {} zcat {} 2>/dev/null | head -n 1

표준 오류 출력을 삭제합니다(/dev/null로 보냅니다).

관련 정보