我执行过两个相同的命令,但它们不共享相同的参数:
time -f "%E %C" mycommandtomeasure
/usr/bin/time -f "%E %C" mycommandtomeasure
第一个不执行,而第二个执行。第一个找不到参数-f
。检查时whereis time
我确实获得了路径/usr/bin/time
,所以我这样理解它与time
是相同的命令/usr/bin/time
。
显然,我的假设是错误的。有人能帮我解释一下吗?
答案1
让我们看看time
该命令实际上在做什么type
(见help type
):
$ type -a time
time is a shell keyword
time is /usr/bin/time
显然,time
在我们的系统上
- 直接内置于 Bash shell 中的关键字
- 可执行文件
/usr/bin/time
由于 shell 关键字优先于可执行文件,因此仅键入时实际运行的time
是 shell 关键字。您还可以从列出它们的顺序或仅列出一种有效类型type -a
的输出中看到这一点。type time
现在,让我们检查一下它们各自能做什么:
可执行文件通常都有一个 manpage(手册页),我们可以使用命令打开并阅读它
man
,即这里man time
。要获取有关 Bash 内置内容的帮助,您必须使用以下
help
命令:help time
你会注意到 shell 关键字支持的选项比可执行文件少,但它有其他优点,例如你可以用它来计算复杂的 Bash 构造(如管道)。请参阅本答案结束举个例子。
但是,如果您需要使用可执行文件而不是 shell 关键字,您可以输入完整路径,即/usr/bin/time
,或者您可以在命令前面加上反斜杠以阻止 Bash 对其进行评估:\time
顺便说一句,虽然time
在 Bash 中是一个 shell 关键字,但它在 Dash 中并不存在sh
,在 Dash 中您只能获得可执行文件。
答案2
当您运行时,time
您会运行一个不支持所有功能的内置 shell 命令。
当您运行 时/usr/bin/time
,您运行的是一个真正的 GNUtime
程序。
您可以设置一个别名来始终运行“真实”的别名。