0

STDOUT と STDERR を何らかのファイルにリダイレクトしようとしています。私はそれである程度成功しています。しかし、以下のコードで1つのことを理解できません。

#!/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

また、コード内で同じファイルを 2 回開いていると、問題が発生する可能性があります。上記では、最初に stdout をファイルにリダイレクトし、次に stderr を stdout にリダイレクトします。

于 2013-02-25T06:22:17.010 に答える
1

なしuse strict;で、

 sdsdf;

と同じです

 "sdsdf";

これが、常に を使用したい理由の 1 つです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 に答える