如何在shell脚本中测量持续时间(以秒为单位)?

Zub*_*air 71 shell timing

我想知道一个操作在Linux shell脚本中需要多长时间.我怎样才能做到这一点?

Tom*_*son 104

正如其他人所建议的那样,使用time命令是个好主意.

另一种选择是使用魔术内置变量$ SECONDS,它包含自脚本开始执行以来的秒数.你可以说:

START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
Run Code Online (Sandbox Code Playgroud)

我认为这是特定于bash的,但是因为你在Linux上,我认为你正在使用bash.

  • 我要在此添加的唯一警告是,对于您自己的变量使用全大写字母的名称是错误的形式,因为这意味着您可能会错误地覆盖shell-builtin变量(f / e,如果有人将其分配给“ SECONDS”,则会停止具有特殊含义)。请参阅POSIX规范@ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html,保留小写字母供应用程序使用,请记住shell和环境变量共享一个名称空间-*环境名称空间包含小写字母的变量名保留给应用程序使用。* (3认同)

Kei*_*ith 39

使用该time命令.time ls /bin.

  • @ shiplu.mokadd.im不?怎么样:`time(ls /; sleep 2; ls/bin)`. (4认同)
  • @ shiplu.mokadd.im-为什么不合适?说明。对我来说似乎不错/准确,并且已经使用了多年... (2认同)

Wol*_*ach 34

试试以下示例:

START_TIME=$SECONDS
# do something
sleep 65

ELAPSED_TIME=$(($SECONDS - $START_TIME))

echo "$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"    
#> 1 min 5 sec
Run Code Online (Sandbox Code Playgroud)


小智 8

许多答案都提到了$SECONDS,但是该变量实际上比他们意识到的还要好

分配给该变量会将计数重置为分配的值,并且扩展后的值将成为分配的值加上分配以来的秒数。

这意味着您可以直接在脚本结尾直接查询此变量以显示经过的时间:

#!/usr/bin/env bash

# Do stuff...

echo "Script finished in $SECONDS seconds."
Run Code Online (Sandbox Code Playgroud)

您还可以为较小的部分设置时间,如下所示:

#!/usr/bin/env bash

# Do stuff

SECONDS=0

# Do timed stuff...

echo "Timed stuff finished in $SECONDS seconds."
Run Code Online (Sandbox Code Playgroud)


小智 5

这是查找经过的时间(以毫秒为单位)的脚本。用您要执行的代码替换sleep 60行。

a=0
while [ $a -lt 10 ]
do
START_TIME=`echo $(($(date +%s%N)/1000000))`
sleep 3
END_TIME=`echo $(($(date +%s%N)/1000000))`
ELAPSED_TIME=$(($END_TIME - $START_TIME))
echo $ELAPSED_TIME
if [ $a -eq 10 ]
then
  break
fi
a=`expr $a + 1`
done
Run Code Online (Sandbox Code Playgroud)