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

hma*_*tt1 3 unix linux perl head

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

问题是当您在命令行上执行以下操作时:

perl myscript.pl | head -n 10
Run Code Online (Sandbox Code Playgroud)

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

amo*_*mon 10

当管道的读取端关闭,并且写入过程试图将某些东西写入管道时,写入过程接收到SIGPIPE.管道被称为破碎.

我们可以抓住这个事件

local $SIG{PIPE} = sub {
  # This is our event handler.
  warn "Broken pipe, will exit\n";
  exit 1;
};
Run Code Online (Sandbox Code Playgroud)

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

# print will now return false with $!{EPIPE} true instead of dying
local $SIG{PIPE} = 'IGNORE';
Run Code Online (Sandbox Code Playgroud)