내가 가지고 있다고 가정 해 봅시다 :
** 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로 전송).