bzip2 - 破管

时间:2016-07-01 08:11:36

标签: bash

我的shell脚本中有以下代码:

bzip2 -dc $filename | head -10 > $output

有时我收到此错误(启用调试输出):

+ head -10
+ bzip2 -dc mylog.bz2

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
        Input file = mylog.bz2, output file = (stdout)

看起来head命令突然退出,bzip2收到SIGPIPE。 我该怎么办?我需要确保前10行将在$output文件中,无论如何。如果其中一个过程失败,我无法保证总是如此。

3 个答案:

答案 0 :(得分:2)

bzip命令在输出其行后退出head命令时将失败。没有数据丢失; head命令完成了它的工作。

如果您对此感到担心,可以将head的调用替换为执行相同操作的sed脚本:

bzip -dc "$filename" | sed -n '1,10p' >"$output"

sed脚本将读取管道中的所有数据,但在完成第10行时不会退出。

答案 1 :(得分:1)

  

看起来head命令突然退出而bzip2收到SIGPIPE。

您期望head做什么?它从输入中读取尽可能多的配置为输出,然后关闭。这几乎是设计

此外:

head -10 

我的head版本需要更像

的内容
head -n10

答案 2 :(得分:1)

您可以使用xargs来避免来自管道的head空内容,这可能是SIGPIPE的原因。这种方式即使bzip2没有提供任何输出,您也不会看到任何错误。

bzip2 -dc $filename | xargs -r head -10 > $output

选项-r表示

 -r     If the standard input does not contain any nonblanks, do not run the command.  Normally, the command is run once even if there is no input.  This option is a GNU extension.