在 bash 中获取经过的时间

Oli*_*ams 23 bash date time

我想在脚本中的某一点执行以下操作:

start_time=date
Run Code Online (Sandbox Code Playgroud)

这在一个或多个进程运行之后:

end_time=date
Run Code Online (Sandbox Code Playgroud)

然后这样做:

elapsed=$end_time-$start_time
echo "Total of $elapsed seconds elapsed for process"
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Mia*_*ati 31

使用自纪元以来的时间轻松识别脚本中的时间跨度

man date
%s     seconds since 1970-01-01 00:00:00 UTC
%N     nanoseconds (000000000..999999999)
Run Code Online (Sandbox Code Playgroud)

.

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 看看(传统上)bc是如何用dc实现的,你可以直接使用dc:`elapsed=$(dc -e "$end_time $start_time - p")` (2认同)

gle*_*man 26

bash 有一个内置的计时器变量

start=$SECONDS
# do stuff
end=$SECONDS
duration=$(( end - start ))
echo "stuff took $duration seconds to complete"
Run Code Online (Sandbox Code Playgroud)

  • 或者`SECONDS=0; ...; 回声“$SECONDS”`。不过要小心 [那个错误](https://lists.gnu.org/archive/html/bug-bash/2016-02/msg00160.html)。 (4认同)

sam*_*sam 8

@jasonwryan 已经建议了它,但我会将它作为答案,因为当我想为脚本计时时,它也是我的首选。要计时myscript只需使用:

time myscript
Run Code Online (Sandbox Code Playgroud)

  • 我会时不时地尝试这个,但这更适合当我需要隔离或计时脚本的子部分时。 (2认同)