沉默STDERR和警告

时间:2013-10-21 10:28:44

标签: perl

warn 4print STDERR 4的区别如何?

perl -e 'local *STDERR; warn 4'

(输出仍然转到STDERR

perl -e 'local *STDERR; print STDERR 4'

(此处无输出)

3 个答案:

答案 0 :(得分:6)

  • warn触发$SIG{__WARN__}
  • warn不使用$\$,
  • warn显然使用原始STDERR中的文件句柄,因为您已经演示了 [1]

  1. 不完全。您的代码也可以证明warn直接使用fd 2,但

    证明了这一点
    close(STDOUT);
    close(STDERR);
    open(STDERR, '>file');
    warn(fileno(STDERR)."abc");  # 1abc
    

答案 1 :(得分:4)

还没有 沉默 STDERR句柄。为了真正沉默,你需要说:

perl -e 'local *STDERR; open(STDERR, ">/dev/null") or die $!; warn 4'

perldoc perlvar告诉:

  

由于'IGNORE'不支持__WARN__挂钩,您可以停用   使用空子程序的警告:

 local $SIG{__WARN__} = sub {};

答案 2 :(得分:2)

local这里只表示typeglob STDERR从这一点开始是本地的,它不会改变sig warn默认处理程序在进入此块时已经看到的STDERR句柄。如果你想让STDERR真正沉默,你需要重新打开其他句柄。

如果你想让它在本地沉默然后恢复,这里是如何做到的,如果你真的必须坚持使用低级别的手柄和手柄:

#!/usr/bin/perl -w
sub f() {
    local *STDERR;
    open STDERR, '>/dev/null';
    warn 4;
}
warn 3;
f();
warn 5;