Perl STDERR重定向失败

时间:2017-09-13 19:48:29

标签: perl file-handling stderr

我们的系统使用的常用函数脚本使用简单的STDERR重定向来创建特定于用户的错误日志。它就像这样

# re-route standard out to text file
close STDERR;
open STDERR, '>>', 'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt'
   or die "couldn't redirect STDERR: $!";

现在,我将它复制粘贴到我自己的函数脚本中,以获取系统特定的错误日志,并且在编译时,它会破坏需要它的脚本。奇怪的是,它甚至不会打印子脚本抛出的错误。我的略微修改版本看起来像,

close STDERR;
open (STDERR, '>>', 'err/STDERR_SPORK.txt')
  or die print "couldn't redirect STDERR: $!";

在命令提示符下编译好的一切,-c返回ok,如果我向函数脚本发出警告并编译,它输出正确。我仍然不明白为什么这会杀死孩子们。我删除了重定向,确定它们有效。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

die(和warn)写入STDERR。如果您在尝试重新打开时关闭STDERR然后需要die,那么您希望在哪里看到错误消息?

由于这是Perl,因此有很多方法可以解决此问题。这是一对夫妇。

  1. 首先将文件打开到tmp文件句柄,如果一切正常,则将其重新分配给STDERR

    if (open my $tmp_fh, '>>', 
       'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt') {
       close STDERR;
       *STDERR = *$tmp_fh;
    } else {
       die "couldn't redirect STDERR: $!";
    }
    
  2. 使用con。对于从命令行运行的程序,大多数系统都有"当前终端"的概念。在Unix系统中,它是/dev/tty,在Windows上,它是con。打开此终端伪文件的输出流。

    open STDERR, '>>', 
       'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt'
       or do {
           open my $tty_fh, '>', 'con';
           print $tty_fh "couldn't redirect STDERR: $!";
           exit 1;
       };
    

答案 1 :(得分:0)

在脚本中没有更改任何内容,并在服务器中进行调整,并且不进行任何更改之后,它现在可以按预期工作。说实话,我不知道该说些什么。