次の組み合わせでシェルコマンドの実行時間を印刷することはできますか?
root@hostname:~# "command to execute" && echo "execution time"
回答:
bashの組み込みtime
(デフォルトで呼び出す必要がありますtime command
)と/usr/bin/time
(フルパスで呼び出す必要がある)には違いがあることを忘れないでください。
ビルトインはtime
常にstderrに/usr/bin/time
出力しますが、時間の出力を特定のファイルに送信できるため、実行されたコマンドのstderrストリームに干渉することはありません。また、/usr/bin/time
の形式はコマンドラインまたは環境変数TIME
で構成できtime
ますが、bashの組み込み形式は環境変数でのみ構成できTIMEFORMAT
ます。
$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357
real 0m3.194s
user 0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
help time
一目見ただけでコマンドライン引数だと思ったので見逃しました。答えを更新します。
time
はほとんどのシェルに組み込まれているコマンドで、実行時の情報をttyに書き込みます。
次のようなものを試すこともできます
start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
またはbash
:
start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
time
ミリ秒を使用するのに対し、秒単位で測定することです。また、変数や計算を使用せずに少数のコマンドの時間を計りたい場合は、括弧を使用できます。たとえばtime ( command1 ; command2 ; command3 )
、合計時間と一緒に個別に時間を計ることもできます。time ( time command1 ; time command2 ; time command3 )
もちろん、20個のコマンドが必要な場合は、この回答のソリューションを使用することをお勧めします。しかし、その後、コマンドをすべてスクリプトに入れることを考え始める必要があります...
コピーやハッシュなどの長時間実行プロセスを開始していて、後でどのくらいの時間がかかったかを知りたい場合は、次のようにします。
$ date; sha1sum reallybigfile.txt; date
これにより、次の出力が生成されます。
Tue Jun 2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0 reallybigfile.txt
Tue Jun 2 21:33:54 PDT 2015
確かに、ここで実装されているように、それはあまり正確ではなく、経過時間を計算しません。しかし、それは単純な汚れであり、時にはあなたが必要とするすべてです。
zshでは使用できます
=time ...
bashまたはzshで使用できます
command time ...
これらは(さまざまなメカニズムによって)外部コマンドの使用を強制します。
man bash
: "TIMEFORMAT変数は、タイミング情報の表示方法を指定するフォーマット文字列に設定できます"