如何在 bash 中使用计时器?

Naw*_*que 39 bash

我需要一个计时器,它会从脚本的最开始开始并在结束时停止。

gle*_*man 40

如果您想要以秒为单位的持续时间,请在顶部使用

start=$SECONDS
Run Code Online (Sandbox Code Playgroud)

最后

duration=$(( SECONDS - start ))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ana 30

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

时间命令 [参数]

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

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

$ time cleanup.sh
Run Code Online (Sandbox Code Playgroud)

  • 了解您正在使用的“时间”。https://hackernoon.com/usr-bin-time-not-the-command-you-think-you-know-34ac03e55cc3 (2认同)

Phi*_*ons 15

我意识到这是一个非常古老的问题,但是当我想/需要知道某事运行需要多长时间时,这就是我为任何事情做的方式。

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

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

echo "Completed in $SECONDS seconds"
Run Code Online (Sandbox Code Playgroud)

举个例子:

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

  • 对于那些不想要如此复杂的时间格式的人来说,这是一个快捷方式:`date +%T -d "1/1 + $SECONDS sec"`(仅限于少于 24 小时,但您也可以适应添加天数) (3认同)

小智 5

#!/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}'
Run Code Online (Sandbox Code Playgroud)