bashで経過時間を取得する

スクリプトのある時点で次のことを実行したい:

start_time=date 

そして1つまたは複数のプロセスが実行された後のこれ:

end_time=date 

そしてこれを行います:

elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process" 

これを行うにはどうすればよいですか?

コメント

回答

エポックからの時間を使用して、スクリプト内の期間を簡単に識別します

man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999) 

start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process 

Bashは浮動小数点数をサポートしていないため、bcなどの外部ツールを使用して次のような時間を比較する必要があります。 1475705058.042270582-1475705053.040524971

start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process 

コメント

  • これが私が探していたのは..これにマイクロタイムを含めることはできますか?
  • date '+%s.%N'を試してください
  • DSTやコマンドのローカルな問題を回避するために、date -uを使用してdateを呼び出す必要があります。 この回答をお読みください
  • (従来の)bcがdcでどのように実装されているかを見て、dcを直接使用できます:elapsed=$(dc -e "$end_time $start_time - p")

回答

bashには組み込みタイマー変数

start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete" 

コメント

  • またはSECONDS=0; ...; echo "$SECONDS"。ただし、そのバグには注意してください。

回答

@jasonwryanはすでにそれを提案していますが、スクリプトの時間を計りたいときの頼みの綱でもあるので、答えとしてそれを投げます。 myscript の時間を計るには、単に次のように使用します。

time myscript 

コメント

  • 時々これを試しますが、これは必要な場合に適していますスクリプトのサブセクションを分離または時間指定します。
  • これは、スクリプト自体の中で導出された経過時間を使用する場合、たとえば、スクリプトが1秒あたりに処理できた単位数を計算する場合には役立ちません。 。

回答

ソリューション。ただし、@ Miataには.%Nが含まれていますが、dateの実行にコストがかかる場合、ナノ秒でどのようなメリットが得られるかわかりません。サブシェルのコマンド。したがって、実際には、date +%sで十分です。もう1つ注意すべき点は、date +%sエポックは1970-01-0100:00:00UTCです。つまり、時間には絶対的なエポックがあり、シェルスクリプトのさまざまなインスタンス間またはさまざまなマシン間で時間測定値を共有できます。

(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24 

@glennjackmanが好きです ” SECONDS bash組み込み変数を参照しているため、回答します。ここで注意すべきことは、エポックはプロセスが開始された時刻です。したがって、この手法を使用できるのは、そのスクリプト内で発生することの時間を測定します。

(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24 

もう1つは、すべての割り当てを(( ))コマンド。つまり、次のように書き換えることができます。

cmd=$(( some_expression )) 

as

(( cmd=some_expression )) 

これを行うことで、$シンボルの発生を最小限に抑えることができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です