我想在一些不同的条件下在linux shell中执行一些东西,并且能够输出每次执行的执行时间。

我知道我可以写一个perl或python脚本,可以做到这一点,但有一种方法我可以在shell中做到这一点吗?(恰好是bash)


当前回答

#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

其他回答

如果您只需要精确到秒,您可以使用内置的$SECONDS变量,该变量计算shell已经运行的秒数。

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done

一个可能简单的方法(可能不能满足不同用户的需求)是使用shell PROMPT。这是一个简单的解决方案,在某些情况下可能有用。你可以使用bash提示功能,如下例所示:

export PS1='[\t \u@\h]\$' 

上面的命令将导致shell提示符更改为:

[HH:MM:SS username@hostname]$ 

每次运行命令(或按回车键)返回到shell提示符时,提示符将显示当前时间。

notes: 1) beware that if you waited for sometime before you type your next command, then this time need to be considered, i.e the time displayed in the shell prompt is the timestamp when the shell prompt was displayed, not when you enter command. some users choose to hit Enter key to get a new prompt with a new timestamp before they are ready for the next command. 2) There are other available options and modifiers that can be used to change the bash prompt, refer to ( man bash ) for more details.

如果您打算以后使用时间来计算,请学习如何使用/usr/bin/time的-f选项来输出节省时间的代码。下面是我最近使用的一些代码,用于获取和排序整个班级的学生程序的执行时间:

fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...

后来我将所有$timefile文件连接起来,并将输出输出到Lua解释器中。你可以用Python或bash或任何你喜欢的语法做同样的事情。我喜欢这个技巧。

你可以使用time和subshell ():

time (
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
)

或者在同一个shell{}中:

time {
  for (( i=1; i<10000; i++ )); do
    echo 1 >/dev/null
  done
}

方法是

$ > g++ -lpthread perform.c -o per
$ > time ./per

输出为>>

real    0m0.014s
user    0m0.010s
sys     0m0.002s