如何在bash中使用计时器?


30

我需要一个计时器,它将在脚本的开始处开始,并在结尾处停止。


2
请写下您要实现的目标。测量脚本工作时间使用time命令(time ./script.sh),打印输出当前时间使用date命令等等。


使用基本的Linux cmd:time yourprogram.sh,@ Marius Cotofana解释了这一点
Martijn van Wezel

Answers:



23

您可以使用Linux的内置time命令。从手册页:

时间COMMAND [参数]

time确定从字符串FORMAT中显示有关COMMAND使用的资源的信息。如果在命令行上未指定格式,但是设​​置了TIME环境变量,则将其值用作格式。

要计时cleanup.sh脚本,请使用:

$ time cleanup.sh

1
知道time您正在使用。hackernoon.com/...
km6zla

8

我意识到这是一个很老的问题,但是当我想/需要知道某件事情要花多长时间时,这就是我做任何事情的方式。

Bash有一个内置的秒计时器,其内部变量的形式名为SECONDS(其他内部变量请参见:此处

SECONDS=0在检查运行时之前放置任何内容。它必须在任何用户输入之后才能获得良好的结果,因此,如果您要提示输入信息,请将其放在提示之后。

然后,将其放在要检查的内容的末尾:

if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

如果您只想知道以秒为单位的时间,则可以将以上内容简化为:

echo "Completed in $SECONDS seconds"

举个例子:

read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

3
那些不希望如此复杂的时间格式的人的捷径:(date +%T -d "1/1 + $SECONDS sec"限制在24小时以内,但您也可以适应增加日期)
xhienne

1
#!/bin/bash

start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)

seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'

echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

1
嗨,欢迎使用Unix SE!仅代码的答案看起来不太好,也许您可​​以解释脚本的作用。
彼得说恢复莫妮卡

0

@anask为这个答案提供了一个聪明的解决方案,只是我建议使用本机$SECONDS来创建一个新的解决方案

awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

和的用途printf是将经过的秒数分别转换为相应的小时,分​​钟,秒。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.