スクリプトの完了時間を表示したいです。
私が今やっていることは -
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
これはスクリプトの開始時刻と終了時刻を示しています。プロセッサ時間/IO時間など、細かい出力を表示できますか?
答え1
time
スクリプトを呼び出すときに使用してください。
time yourscript.sh
答え2
time
オプションでない場合、
start=`date +%s`
stuff
end=`date +%s`
runtime=$((end-start))
または1秒未満の精度が必要で、それをbc
取り付けた場合
start=`date +%s.%N`
stuff
end=`date +%s.%N`
runtime=$( echo "$end - $start" | bc -l )
答え3
ただ電話してくださいtimes
パラメータなしでスクリプトを終了します。
ksh
または で代わりにzsh
使用することもできますtime
。ウォールクロック時間も提供されますzsh
。time
ユーザーそしてシステムCPU時間。
スクリプトの終了状態を維持するには、次のようにします。
ret=$?; times; exit "$ret"
または、トラップを追加することもできますEXIT
。
trap times EXIT
この方法では、シェルが終了するたびにtimesが呼び出され、終了状態が維持されます。
$ bash -c 'trap times EXIT; : {1..1000000}'
0m0.932s 0m0.028s
0m0.000s 0m0.000s
$ zsh -c 'trap time EXIT; : {1..1000000}'
shell 0.67s user 0.01s system 100% cpu 0.677 total
children 0.00s user 0.00s system 0% cpu 0.677 total
また、bash
両方ともksh
毎秒自動的に増加する特別な変数zsh
があることに注意してください。$SECONDS
sumsでは、zsh
このksh93
変数は精度を上げるために浮動小数点数(有効)に設定することもできますtypeset -F SECONDS
。これはCPU時間ではなく壁時計時間です。
答え4
少し遅れましたが、他の人が検索でこのスレッドを偶然見つけた場合に備えて、私のソリューション(1秒未満の精度)を投稿したかったのです。出力形式は日、時間、分、最後の秒です。
res1=$(date +%s.%N)
# do stuff in here
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
誰かがこれが役に立つと思います!
[編集] bash printfでフィールド定義のすべての文字を計算する必要があります。秒を点の前の2桁まで埋めるには、次のように定義する必要があります%07.4f
(すべての数字と粘度はフィールドの長さとして計算されます)。したがって、行は次のようになります。
LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%07.4f\n" $dd $dh $dm $ds