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


14

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

如果通过使用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


这就是为什么which基本上没用的原因...
Bakuriu 16'9

Answers:


23

第一个是bash自己的内置关键字time(与一起编译bash),第二个是外部可执行文件time/usr/bin/timetime软件包一起提供)。

另外,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(without -a)获得正在执行的代码:

type time

-a告诉type将在Shell的内部实体中进行PATH搜索,即在所有可能的源中进行搜索。

如果出于某种原因需要外部设备,请使用以下任意一种:

\time
"time"
'time'
command time

啊,我明白了,所以which不考虑内置函数吗?我应该总是先检查一下type -a。事实上,它似乎type是优于which因为它输出的位置/usr/bin/time,以及
xaxa

@xaxa是的,请检查我的修改。
heemayl

感谢您的详细回答!那有什么which用呢?
xaxa

1
@xaxa type确实更好---如果您使用的是bash。另一个外壳可能没有typebulitin,也没有time内置的。
jpaugh

2
@jpaugh不太正确。POSIX允许time只,但不对外typetype是所有POSIX兼容的炮弹可用。
heemayl

4

内置实用程序和外部实用程序之间的另一个区别是,Bash的内置程序time 将计时完整的管道或调用Shell函数的时间(显然甚至是循环,但手册似乎并未承诺)。外部time程序由于不在外壳中,因此不知道周围的代码。

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
...

尽管标准中已指定时间,但尚不清楚其在管道中的行为方式,因此可以实现更强大的内部实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.