time
次のコマンドで出力を取得しようとしています。私が欲しいのは経過時間を取得することだけですが、何も取得しません。
$result = `/usr/bin/time -f %e "./"$PROG > /dev/null`;
print $result;
必要なリダイレクトは少し注意が必要です。
my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`;
time
測定値を標準エラー(ファイル記述子2)で出力しますが、Perlバックティックは標準出力(ファイル記述子1)をキャプチャします。上記のリダイレクトシーケンスを「最初に標準エラーを標準出力の宛先に送信し、次に元の標準出力を破棄する」と読みます。</ p>
外部コマンドからキャプチャするにはどうすればよいSTDERR
ですか?Perl FAQで、あなたが見ている問題に対処しています。
コマンドをキャプチャするが、
STDERR
そのコマンドを破棄するにはSTDOUT
:$output = `cmd 2>&1 1>/dev/null`; # either with backticks $pid = open(PH, "cmd 2>&1 1>/dev/null |"); # or with an open pipe while (<PH>) { } # plus a read
…これらすべての例では、順序付けが重要です。これは、シェルがファイル記述子のリダイレクトを厳密に左から右の順序で処理するためです。
system("prog args 1>tmpfile 2>&1"); system("prog args 2>&1 1>tmpfile");
最初のコマンドは、標準出力と標準エラーの両方を一時ファイルに送信します。2番目のコマンドは、古い標準出力のみをそこに送信し、古い標準エラーが古い標準出力に表示されます。
末尾の改行が含まれていることに注意してください。これは、次のように$result
削除できます。chomp
chomp $result;
またはすべて一行で
chomp(my $result = `/usr/bin/time -f %e "./"$PROG 2>&1 >/dev/null`);