1

重複の可能性:
Perlで、stderr、stdout、および終了コードを一度にキャプチャするにはどうすればよいですか?
STDOUTをファイルにパイプしている間にSTDERRの出力をキャプチャする

次のコードを使用してプロセスを実行しています。

open( my $proch, "-|", $command, @arguments );

残念ながら、私はstdoutを読みます。しかし、私もstderrを読みたいと思います。

Stderrリダイレクトにより、次のエラーが発生します。

open( my $proch, "2>&1 -|", $command, @arguments );
>>> Unknown open() mode '2>&1 -|' at file.pl line 289

stderrstdoutに転送するにはどうすればよいですか?

4

1 に答える 1

4

2>&1はシェルコマンドの一部ですが、シェルを実行していません。

open( my $proch, "-|", 'sh', '-c', '"$@" 2>&1', '--', $command, @arguments );

余分なプロセスが発生しないようにする場合は、次を使用できます。

use IPC::Open3 qw( open3 );

open local *CHILD_STDIN, '<', '/dev/null') or die $!;
my $pid = open3(
   '<&CHILD_STDIN',
   \local *PROCH,
   undef, # 2>&1
   $command, @arguments
);

while (<PROCH>) { ... }

waitpid($pid, 0);
于 2012-12-06T08:36:46.297 に答える