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

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

time複数のコマンドの時間を測定するためにコマンドを実行したいと思います。

私がしたいことは:

  • コマンドを使用してtime複数のコマンドを同時に実行するのにかかる時間の測定
  • 書くただtimeファイルに出力
  • stderr私が測定しているすべてのコマンドを書き留めてくださいstderrいいえファイルとして

私がすることいいえ私がしたいことは:

  • 複数のコマンドを別々のスクリプトに書き込む
    • なぜ?これは、すでに私がプログラムで生成して作成したスクリプトだからです。その他一時的なスクリプトは私が望むものよりも混乱しています。

私が今まで試したこと:

  1. /usr/bin/time --output=outtime -p echo "a"; echo "b";
    • 動作せず、time最初の項目でのみ実行されます。
  2. /usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
    • 動作しません。(予期しないトークンです。
  3. /usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
    • 動作しません。 「該当するファイルやディレクトリはありません。」
  4. /usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
    • 動作しません。 「該当するファイルやディレクトリはありません。」
  5. time ( echo "a"; echo "b"; ) 2>outtime
    • STDERRすべてをにリダイレクトするため、機能しませんouttimetimeそこから出力したいです。
  6. そしてもちろん、time --output=outime echo "a";
    • ので動作しません--output=outime: command not found

どうすればいいですか?

答え1

sh -c 'commands'たとえば、次のコマンドとして使用されます。

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

答え2

正解ではありませんが、質問と非常に関連しています。
複数のプログラムのタイミング統計を取得するには、括弧を組み合わせる必要があります。セミコロンでコマンドを区切ります。;または&&、command2のみを実行する必要がある場合command1がエラーなしで終了する場合:

time ( command1 ; command2 )

time ( command1 && command2 )

答え3

この試み:

% (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

説明する:

まず、リダイレクトする方法を見つける必要がありますtimetimeこれはシェル組み込みであるため、リダイレクトを含むコマンドライン全体を測定するコマンドとして使用します。したがって、

% 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の意見はこれが。 ]サブシェルで実行し、そのサブシェルの出力をリダイレクトして出力リダイレクトを達成できますbashtimetime

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

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

私たちは「外部」を持っています。

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

つまり、ファイルディスクリプタ3に書き込まれたすべての内容は、現在のファイルディスクリプタ2(標準エラー)が出力されるのと同じ場所(ターミナル)に出力されます。次に標準エラーをファイルにリダイレクトしますtimeout

これで、stdoutとfd 3で書かれたすべての内容が端末に移動し、stderrで書かれたすべての内容がファイルに移動されます。残りは、測定コマンドの標準誤差をfd 3にリダイレクトすることです。

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

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

結局、私たちは次のようになります。

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

それはすべてです。

答え4

Bashでは、これは私にとって完璧に機能し、コンソールには何も印刷されません。

> time ( echo "a"; echo "b") 1>/dev/null 2>output_time_file

> cat output_time_file

real    0m0.000s
user    0m0.000s
sys 0m0.000s

関連情報