如果写入STDERR有什么消息?

时间:2013-12-12 18:59:25

标签: perl

如果有任何内容写入STDERR,我如何强制 Perl 脚本死?

当这样的输出发生时,或者甚至在此之前,应立即进行此类操作,以防止输出......

2 个答案:

答案 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处理程序,则不起作用。