3

time次のコマンドで出力を取得しようとしています。私が欲しいのは経過時間を取得することだけですが、何も取得しません。

$result = `/usr/bin/time -f %e "./"$PROG > /dev/null`;
print $result;
4

1 に答える 1

7

必要なリダイレクトは少し注意が必要です。

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`);
于 2013-02-21T16:24:54.920 に答える