管道Perl脚本输出到head -n 10打印10行后会杀死脚本

时间:2013-07-23 16:29:59

标签: linux perl unix head

My Perl脚本输出并记录多行文本,并进行一些清理并压缩END块中的一些日志。

问题是当你在命令行上执行类似的操作时:

perl myscript.pl | head -n 10

这会导致脚本在输出10行后立即死亡,因此END块不会执行,并且日志不会被压缩。有没有办法绕过这个并确保我的END块中的代码仍然执行?

1 个答案:

答案 0 :(得分:10)

当管道的读取端关闭,并且写入过程尝试将某些内容写入管道时,写入过程将收到SIGPIPE。管道被称为破碎

我们可以像

一样捕获此事件
local $SIG{PIPE} = sub {
  # This is our event handler.
  warn "Broken pipe, will exit\n";
  exit 1;
};

这将优雅地退出您的程序。您可以提供字符串IGNORE,而不是将子安装为事件处理程序。这样就可以让你的脚本继续运行,好像什么都没发生一样。

# print will now return false with $!{EPIPE} true instead of dying
local $SIG{PIPE} = 'IGNORE';