複数のコマンドで時間を実行し、時間出力をファイルに書き込む方法は?


66

timeコマンドを実行して、いくつかのコマンドの時間を測定したい。

私がやりたいことは:

  • 一緒に追加されたすべての実行時間を測定します
  • 書き込みtimeファイルに出力します
  • 書くSTDERR私が測定していますコマンドからSTDERR

私は何をしないでやりたいことはあります

  • いくつかのコマンドを個別のスクリプトに記述します(これはすべて、既にプログラムで生成しているスクリプトであり、ANOTHER一時スクリプトの作成は必要以上に混乱するためです)

私がこれまでに試したこと:

/usr/bin/time --output=outtime -p echo "a"; echo "b";

動作せずtime、最初のものでのみ実行されます。

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

動作しません、(予期しないトークンです。

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

「そのようなファイルやディレクトリはありません」とは機能しません。

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

「そのようなファイルやディレクトリはありません」とは機能しません。

time ( echo "a"; echo "b"; ) 2>outtime

すべてSTDERRにリダイレクトするため、機能しませんouttimetime出力のみが必要です。

そしてもちろん、

time --output=outime echo "a";

以来、動作しません--output=outime: command not found

どうすればいいですか?

回答:


90

sh -c 'commands'コマンドとして使用します。例:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
短いバージョン:time -p sh -c 'echo "a"; echo "b"'
Geo

8

これを試して:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

説明:

まず、の出力をリダイレクトする方法を見つける必要がありますtime。以来、timeシェル組み込み、それはリダイレクトを含む、測定すべきコマンドとして完全なコマンドラインをとります。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example、

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[注:janosのコメントは、これがの場合ではないことを示唆していbashます。] サブシェルでtime実行timeし、そのサブシェルの出力をリダイレクトすることにより、出力のリダイレクトを実現できます。

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

これで、の出力を正常にリダイレクトできましたtimeが、その出力は、測定しているコマンドのエラー出力と混在しています。2つを分離するには、追加のファイル記述子を使用します。

「外側」には

% (time ... ) 3>&2 2>timeout

つまり、ファイル記述子3に書き込まれたものはすべて、ファイル記述子2(標準エラー)が現在(端末)を出力しているのと同じ場所に出力されます。そして、標準エラーをファイルにリダイレクトしますtimeout

これで、stdoutとfd 3に書き込まれたものはすべてターミナルに行き、stderrに書き込まれたものはすべてファイルに行きます。残っているのは、測定したコマンドのstderrをfd 3にリダイレクトすることです。

% (time whatever 2>&3) 3>&2 2>timeout

さて、時間を複数のコマンドで測定するには、それらを(other!)サブシェル(括弧内)で実行する必要があります。そして、それらすべてのエラー出力をfd 3にリダイレクトするには、それらを中括弧内にグループ化する必要があります。

だから、最後に、私たちは到着します:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

それでおしまい。


これはPOSIXシェルの構文エラーです。おそらくバシズムですか?
ジョシュ

@joschここで使用されるシェルはzshです。
アンガス

6

正解ではありませんが、質問に非常に関連しています。
複数のプログラムのタイミング統計を取得するには、括弧が必要です。コマンドはセミコロンで区切ります。

time ( command1 ; command2 )

1
これはいいね。さらに良いのは、コマンド間で&&を使用するtime ( command1 && command2 )ことです。最初のコマンドが失敗した場合のように。もう一方の実行には進みません。
bikashg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.