time
複数のコマンドの時間を測定するためにコマンドを実行したいと思います。
私がしたいことは:
- コマンドを使用して
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
。
- ので動作しません
どうすればいいですか?
答え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
説明する:
まず、リダイレクトする方法を見つける必要があります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
測定中のコマンドのエラー出力と混在しました。両方を分離するために追加のファイル記述子を使用します。
私たちは「外部」を持っています。
% (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