这可能是新手的问题,但我不明白这是如何配置的,以及为什么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 的内部实体中搜索-a
,type
并且在PATH
ie 中搜索所有可能的来源。
如果由于某种原因您需要外部的,请使用以下任一个:
\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
...
虽然时间指定的在标准中,它没有指定应该如何在管道中运行,因此像这样的更强大的内部实现是可能的。