내가 가지고 있다고 가정하십시오 :
** 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
파이프를 통해 쓰기를 시도하기 때문에 발생합니다 (첫 번째 줄 출력 작업이 완료되었기 때문에). .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로 보냅니다).