0

我正在尝试将我的 STDOUT 和 STDERR 重定向到某个文件。我在某种程度上是成功的。但我无法理解以下代码中的一件事。

#!/usr/bin/perl
open (STDOUT,">/var/tmp/outfile") or die "problem : $!";
open (STDERR,">>/var/tmp/outfile") or die "problem : $!";
print "$_\n" foreach (1..10);
sdsdf;  # buggy line inserted wantedly

我插入了最后一行,假设 perl 会抛出一个错误,并且会被重定向到文件但它没有发生。我的程序不会在屏幕上或输出文件中出现任何错误。请帮助我理解这种行为。

4

2 回答 2

2

sdsdf 没有产生任何错误(如果你use strict会看到一些编译时错误),这就是你没有看到任何消息的原因。试试这个:

use warnings;
use strict;
open (STDOUT,">outfile1") or die "problem : $!";
open STDERR, ">&STDOUT";
print "$_\n" foreach (1..10);
die("aaaa");  # buggy line inserted wantedly

同样在您的代码中,您打开同一个文件两次,这可能会导致一些问题。在上面我们首先将stdout重定向到一个文件,然后将stderr重定向到stdout。

于 2013-02-25T06:22:17.010 回答
1

没有use strict;

 sdsdf;

是相同的

 "sdsdf";

这就是您一直想使用的原因之一use strict; use warnings;。让我们从添加它开始。


因此,您希望将所有输​​出(包括编译时错误)记录到文件中。好吧,在编译代码后重定向 STDERR 不会发生这种情况。最好的方法是从你的程序之外。

script.pl >/var/tmp/outfile 2>&1

但它可以在你的程序中完成。

#!/usr/bin/perl
use strict;
use warnings;

BEGIN {
   open(STDOUT, '>', '/var/tmp/outfile')
      or die("Can't redirect STDOUT: $!\n");
   open(STDERR, '>&', \*STDOUT)
      or die("Can't redirect STDERR: $!\n");
}

print "$_\n" foreach (1..10);
sdsdf;  # Syntax error
于 2013-02-25T09:59:41.303 回答