为什么时间的输出格式会根据我的调用方式而变化

为什么时间的输出格式会根据我的调用方式而变化

这可能是新手的问题,但我不明白这是如何配置的,以及为什么time在这两种情况下命令的输出格式不同:

如果使用 via time,输出是三行基本信息

$ time sleep 1

real    0m1.003s
user    0m0.000s
sys     0m0.000s

然后我可以检查使用了哪个二进制文件

$ which time
/usr/bin/time

并直接调用它以完全不同的格式获取输出,并提供更多信息

$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 2000maxresident)k
0inputs+0outputs (0major+77minor)pagefaults 0swaps

没有与以下相关的别名time

$ alias | grep time
$ 

我在跑Ubuntu 16.04

答案1

第一个是bash自己的内置关键字time(用 编译bash),第二个是外部可执行文件time/usr/bin/time,随time包附带)。

此外,which由于它仅搜索,因此无法显示 shell 的内置命令或关键字PATH,您需要使用type。作为 shell 内置命令,type它还可以检查 shell 的内部实体(以及PATH),因此您可以通过以下方式发现差异:

type -a time

这里:

$ type -a time
time is a shell keyword
time is /usr/bin/time

如果你只使用 ,第一个就会被执行。你也可以只使用(不带)time来获取正在执行的内容:type-a

type time

告诉在 shell 的内部实体中搜索-atype并且在PATHie 中搜索所有可能的来源。

如果由于某种原因您需要外部的,请使用以下任一个:

\time
"time"
'time'
command time

答案2

内置实用程序和外部实用程序之间的另一个区别是,Bash 的内置time 将计时完成管道或者调用 shell 函数(显然甚至是循环,但手册似乎没有承诺这一点)。外部time不能,因为它在 shell 之外,不知道周围的代码。

bash$ time echo blah | sleep 3
real    0m3.002s
...
bash$ /usr/bin/time echo blah | sleep 3
0.00user 0.00system 0:00.00elapsed ?%CPU 
...
bash$ time for x in 1 2 3 ; do sleep 1 ; done
real    0m3.006s
...

虽然时间指定的在标准中,它没有指定应该如何在管道中运行,因此像这样的更强大的内部实现是可能的。

相关内容