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실행 시(그리고 그 이후에는 첫 번째 파일을 제외한 각 파일에 대해 한 번씩) 종료 후 (Task의 첫 번째 줄 출력이 완료되었으므로) head파이프를 통해 쓰기를 시도하기 때문에 발생합니다.head

생성된 모든 데이터를 읽으면 이러한 특정 오류가 발생하는 것을 방지할 수 있습니다 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로 전송).

관련 정보