如果有任何内容写入STDERR,我如何强制 Perl 脚本死?
当这样的输出发生时,或者甚至在此之前,应立即进行此类操作,以防止输出......
答案 0 :(得分:14)
这似乎不是一个特别聪明的想法,但绑定文件句柄应该可行。根据{{3}}联机帮助页:
当STDERR绑定时,将调用其PRINT方法以发出警告和错误消息。在调用期间暂时禁用此功能,这意味着您可以在PRINT中使用warn()而无需启动递归循环。
所以像这样的东西(改编自手册页的例子)应该起作用:
package FatalHandle;
use strict;
use warnings;
sub TIEHANDLE { my $i; bless \$i, shift }
sub PRINT {
my $r = shift;
die "message to STDERR: ", @_;
}
package main;
tie *STDERR, "FatalHandle";
warn "this should be fatal.";
print "Should never get here.";
输出(退出代码为255):
message to STDERR: this should be fatal. at fh.pl line 17.
答案 1 :(得分:7)
这是一个无论STDERR(fd 2)如何写入的方法,即使它是不使用Perl的STDERR
变量的C扩展也是如此。它甚至会杀死写入STDERR的子进程!
{
pipe(my $r, my $w)
or die("Can't create pipe: $!\n");
open(STDERR, '>&', $w)
or die("Can't dup pipe: $!\n");
close($r);
}
print "abc\n";
print "def\n";
print STDERR "xxx\n";
print "ghi\n";
print "jkl\n";
$ perl a.pl
abc
def
$ echo $?
141
在Windows上不起作用。如果添加SIGPIPE处理程序,则不起作用。