time
コマンドを実行して、いくつかのコマンドの時間を測定したいと思います。
私がしたいのは:
time
出力をファイルに書き込むSTDERR
をSTDERR
に書き込みます私がすること[〜#〜]ない[〜#〜]やりたいことは
私がこれまでに試したこと:
_/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
をouttime
にリダイレクトするため、機能しません。そこにはtime
の出力のみが必要です。
そしてもちろん、
_time --output=outime echo "a";
_
_--output=outime: command not found
_以降は機能しません。
どうすればできますか?
使用する sh -c 'commands'
コマンドとして。例:
/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'
正解ではありませんが、質問に非常に関連しています。
複数のプログラムのタイミング統計を取得するには、括弧を組み合わせる必要があります。コマンドはセミコロンで区切ります。
time ( command1 ; command2 )
これを試して:
% (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
はシェルに組み込まれているため、リダイレクトを含む完全なコマンドラインを測定対象のコマンドとして使用します。したがって、
% 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
それでおしまい。