我希望了解Linux shell脚本中的操作需要多长时间。我怎么能这样做?
答案 0 :(得分:97)
正如其他人所建议的,使用time命令是一个好主意。
另一种选择是使用魔术内置变量$ SECONDS,它包含自脚本开始执行以来的秒数。你可以说:
START_TIME=$SECONDS
dosomething
ELAPSED_TIME=$(($SECONDS - $START_TIME))
我认为这是特定于bash的,但是因为你在Linux上,我认为你正在使用bash。
答案 1 :(得分:39)
使用time
命令。 time ls /bin
。
答案 2 :(得分:33)
请尝试以下示例:
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
答案 3 :(得分:4)
以下是查找经过的时间的脚本(以毫秒为单位)。将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
答案 4 :(得分:4)
许多答案都提到了$SECONDS
,但该变量实际上是even better than they realize:
分配给该变量会将计数重置为分配的值,并且扩展的值将成为分配的值加上分配以来的秒数。
这意味着您可以直接在脚本结尾直接查询此变量以打印经过的时间:
#!/usr/bin/env bash
# Do stuff...
echo "Script finished in $SECONDS seconds."
您还可以为较小的部分设置时间,例如:
#!/usr/bin/env bash
# Do stuff
SECONDS=0
# Do timed stuff...
echo "Timed stuff finished in $SECONDS seconds."
答案 5 :(得分:2)
只是为了帮助像我这样的人收到错误:
arithmetic expression: expecting primary: "-"
检查以下开头的shellcript:
#!/bin/bash
干杯!
答案 6 :(得分:1)
GNU time
我也很喜欢GNU time
命令:https://www.gnu.org/software/time/,与内置time
的Bash相比,它提供了一些重要的选项。
样品用量:
env time --format '%e' --output time.log sleep 1
输出:
1.00
说明:
env
:找到/usr/bin/time
而不是内置的Bash
--format '%e'
:以秒为单位的打印时间,请参见man time
。
这通常是基准测试时我想要的:一个数字而不是分钟+秒。
我经常使用的一个重要模式是:
bench-cmd() (
logfile=time.log
echo "cmd $@" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' $@"
eval "$bench_cmd"
echo >> "$logfile"
)
rm -f time.log
bench-cmd sleep 1
bench-cmd sleep 2
bench-cmd sleep 3
cat time.log
输出:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
说明:
--output
:将时间输出到文件。
默认情况下,输出将输出到stderr,因此此选项对于将计时与命令的stderr分开很重要。
--append
:附加到文件而不是覆盖。
这使我可以将整个基准测试输出集中在一个文件中。