打印shell命令的执行时间

jac*_*ack 75 shell command-line

是否可以使用以下组合打印shell命令的执行时间?

root@hostname:~# "command to execute" && echo "execution time"
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 104

time 是大多数shell中的内置命令,它将执行时间信息写入tty.

你也可以尝试类似的东西

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.
Run Code Online (Sandbox Code Playgroud)

或者在bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
Run Code Online (Sandbox Code Playgroud)

  • 优秀,比接受的答案更灵活 (6认同)
  • 这种方法的一个缺点是它以秒为单位进行测量,而 `time` 使用毫秒。如果你想在不使用变量和计算的情况下将少数命令一起计时,你可以使用括号:`time ( command1 ; command2 ; command3 )` 你甚至可以将它们单独与总时间一起计时,如下所示: time ( time command1 ; time command2 ; time command3 )`当然,如果你想要二十个命令,使用这个答案的解决方案可能会更好。但是,您应该开始考虑将所有命令都放在脚本中... (2认同)

Mar*_*off 64

不要忘记bash的内置time(当你这样做时应默认调用time command)和/usr/bin/time(它应该要求你通过其完整路径调用它)之间存在差异.

内置程序time始终打印到stderr,但/usr/bin/time允许您将时间输出发送到特定文件,因此您不会干扰执行的命令的stderr流.此外,/usr/bin/time可以在命令行环境变量上配置格式TIME,而bash的内置time格式TIMEFORMAT环境变量配置.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)

  • 我们是 9 年后,命令只用了 0m0.018s。我只是想我会指出这一点。 (3认同)

Jas*_*son 24

root@hostname:~# time [command]
Run Code Online (Sandbox Code Playgroud)

它还区分使用的实时时间和使用的系统时间.

  • `time`写给tty,而不是stderr.我想这会让事情变得更糟. (2认同)

Jan*_*sen 12

对于逐行delta测量,请尝试gnonom.

它是一个命令行实用程序,有点像moreutils的ts,它将时间戳信息添加到另一个命令的标准输出中.对于长期运行的过程非常有用,在这些过程中,您需要记录长时间运行的历史记录.

将任何内容管道到gnomon都会在每行前面添加一个时间戳,表示该行是缓冲区中最后一行的长度 - 也就是下一行显示的时间长度.默认情况下,gnomon将显示每行之间经过的秒数,但这是可配置的.

gnomon演示


nav*_*nav 8

添加到@ mob的答案:

追加%Ndate +%s给了我们精确到纳秒:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
Run Code Online (Sandbox Code Playgroud)


小智 5

在 zsh 中,您可以使用

=time ...
Run Code Online (Sandbox Code Playgroud)

在 bash 或 zsh 中,您可以使用

command time ...
Run Code Online (Sandbox Code Playgroud)

这些(通过不同的机制)强制使用外部命令。


Eth*_*han 5

如果我要启动一个长时间运行的过程(例如副本或哈希),并且想在以后知道它花费了多长时间,则可以执行以下操作:

$ date; sha1sum reallybigfile.txt; date
Run Code Online (Sandbox Code Playgroud)

这将导致以下输出:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015
Run Code Online (Sandbox Code Playgroud)

诚然,如此处所实现的,它不是很精确,也不计算经过的时间。但这很简单,有时甚至是您所需要的。