0

システムを使用して、次のような外部コマンドのパイプを実行する Perl スクリプトに取り組んでいます。

system( "command1 | command2 | command3 > outfile" );

ここで、これらすべてのコマンドの STDERR を 1 つのファイルにキャプチャしたいと考えています。これは OS X で動作します:

system( "command1 2> error.log | command2 2> error.log | command3 2> error.log > outfile" );

しかし、エラーが発生するWindowsではそうではありません:

「別のプロセスで使用されているため、プロセスはファイルにアクセスできません」

回避策はありますか?これを移植可能にする必要があるため、可能であればモジュールを避けたいと思います。前もって感謝します。

4

2 に答える 2

0

これは、'>' がファイルの共有を好まないためです。パイプラインの各ステージに独自のエラー ログを与え、パイプラインの終了後に次のように実行します。

  system("cat error1.log erorr2.log error3.log > error.log");

ログを集約するプラットフォームに依存しない方法を次に示します。

my @error_logs = qw( error1.log error2.log error3.log );
open my $errlog, ">>", "error.log" || die "probelm opening error log: $!";

foreach my $sublog ( @error_logs ) {
   open my $fh, "<", $sublog || die "oh boy: $sublog: $!";
   print "$sublog:"
   print $errlog while $fh;
   close $fh;
}

close $errlog;

しかし、そのように傾倒することにした場合は、 IO::CatFile:: Catも存在します。


1)ファイルを共有しないわがままな悪意のある人の名前を修正しました。

2) ログファイルコレクションを追加

于 2013-06-21T16:32:52.040 に答える