假设我有:
** 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
为了我想做的事情,我可以忽略这一点。但是,如果我运行代码并将其通过管道传输到 a 中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)