我的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
文件中,无论如何。如果其中一个过程失败,我无法保证总是如此。
答案 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.