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

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

相关内容