シェルスクリプトでコマンドの開始、終了と経過時間をとる方法

こんにちは、さるまりんです。

シェルスクリプトを書いていて、コマンドにどれくらい時間がかかったかを知りたいことがあります。

dateコマンドを使って

dateコマンドを使って、こんな風に実現してみました。

time-by-date.sh

#!/bin/bash

# 開始時間を取得
start_time=$(date +%s)

echo "start  : $(date +"%Y-%m-%d %H:%M:%S")"

# 実行したいコマンド
your_command="sleep 5"  # 例として'sleep 5'を使用
eval $your_command

# 終了時間を取得
end_time=$(date +%s)

echo "end    : $(date +"%Y-%m-%d %H:%M:%S")"

# 経過時間を計算
elapsed_time=$((end_time - start_time))
echo "elapsed: ${elapsed_time} seconds"

date +%sで開始時間、終了時間を取得し、その差分が経過ということです。
例として、ここではただ5秒待つだけの処理です。

実行すると↓のように表示されます。

$ ./time-by-date.sh 
start  : 2024-10-05 16:47:56
end    : 2024-10-05 16:48:01
elapsed: 5 seconds

SECONDS変数を使って

もう一つの方法です。

time-by-seconds.sh

#!/bin/bash

# SECONDS変数をリセット
SECONDS=0

echo "start   : $(date +"%Y-%m-%d %H:%M:%S")"

# 実行したいコマンド
your_command="sleep 5"  # 例として'sleep 5'を使用
eval $your_command

# 経過時間を取得
elapsed_time=$SECONDS

echo "end    : $(date +"%Y-%m-%d %H:%M:%S")"
echo "elapsed: ${elapsed_time} seconds"

こちらはbashの組み込み変数であるSECONDSを使って経過時間を取得しています。
スクリプトの最初で変数を0でリセットし、最後で取れるのが経過秒数です。
こちらも同じように処理としてはただ5秒sleepさせています。

こちらも実行してみます。

$ ./time-by-seconds.sh 
start   : 2024-10-05 16:49:45
end    : 2024-10-05 16:49:50
elapsed: 5 seconds

最初の方法はdateコマンドを使っているので細かい精度で計測することができます。
二つ目のSECONDSを使う方法では変数の名の通り秒の精度になります。
ただ最初にリセットして最後で取り出すだけで使えるので簡単と言えば簡単ですね。
全体の経過時間のみとるのであればこれがシンプルそうですね。

組み込み機能についてあまり知らないので、こういう便利なものがもっと用意されているんでしょうね。
色々チャレンジしてみることは大切です。

読んでくださってありがとうございました。
それではまた!