如果写入STDERR有什么消息?

Ωme*_*ega 5 perl

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

当这样的输出发生时,或者甚至在此之前,这样的动作应该立即完成,以防止输出......

fri*_*edo 14

这似乎不是一个特别聪明的想法,但绑定文件句柄应该工作.根据perltie联机帮助页:

当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.";
Run Code Online (Sandbox Code Playgroud)

并输出(退出代码255):

message to STDERR: this should be fatal. at fh.pl line 17.
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 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";
Run Code Online (Sandbox Code Playgroud)

$ perl a.pl
abc
def

$ echo $?
141
Run Code Online (Sandbox Code Playgroud)

在Windows上不起作用.如果添加SIGPIPE处理程序,则不起作用.