为什么`time`命令不能使用任何选项?


60

我尝试使用time-f选项的命令来格式化时间输出,但是出现以下错误:

-f: command not found

然后我试图使用其他选项-a-o等我也得到了同样的错误。甚至time --version都不起作用(--version: command not found)。

不要告诉我读这个人,因为我已经读过很多次了……所有这些选项都在这里指定。那么,问题可能出在哪里呢?


sudo apt-get install --reinstall time帮助吗?
jobin 2014年

9
time/usr/bin/time
Rmano 2014年

Answers:


90

好吧,即使您不喜欢它,我也会让您更仔细地阅读man time。在本EXAMPLES节末尾,您将找到:

  Users of the bash shell need to use an explicit path in order to run
  the external time command and not the shell builtin variant.  On system
  where time is installed in /usr/bin, the first example would become
       /usr/bin/time wc /etc/hosts

因此,我假设您使用的bash shell使用内部版本的time,作为shell关键字提供。您可以使用以下命令进行检查:

type time

输出可能是:

time is a shell keyword

如果是这种情况,那么很明显,要使用real time命令,必须使用其显式路径:/usr/bin/time

此外,如果您不想再使用shell关键字time,则可以创建一个永久别名,如下所示:

alias time='/usr/bin/time'

这将覆盖shell关键字,time因为命令:

type time

现在将给出以下输出:

time is aliased to `/usr/bin/time'

5
用于shell内置命令:{info time}和{type time}。对于二进制命令:{where time}和{man time}
Michael Martinez

@Michael info time是关于二进制文件的。help time是关于内置的。
wjandrea

是的,很抱歉,我当时在想“帮助”,但出来了“信息”
Michael Martinez

21

正如其他答案所述,time由于是shell关键字,因此唯一可用的选项是-p

terdon@oregano ~ $ help time
time: time [-p] pipeline
    Report time consumed by pipeline's execution.

Execute PIPELINE and print a summary of the real time, user CPU time,
and system CPU time spent executing PIPELINE when it terminates.

Options:
  -p    print the timing summary in the portable Posix format

因此,您需要运行time中的/usr/bin。这里有几种方法:

  • 改用time可执行文件:

    /usr/bin/time -f %Uuser ls >/dev/null
  • 使用\which使您的shell忽略别名和关键字,而是在您$PATH的主机中搜索匹配的可执行文件:

    \time -f %Uuser ls >/dev/null 
  • 使用command具有类似效果的内建函数:

    command time -f %Uuser ls >/dev/null
  • 使用另一种没有此类关键字的外壳。例如sh(实际上是dash在Ubuntu上):

    sh -c "time -f %Uuser ls >/dev/null"
  • 使用which,它将搜索您的内容$PATH(确定,这很愚蠢):

    $(which time) -f %Uuser ls >/dev/null

有没有办法做time与常规相反的内置复制/usr/bin/time?即将bash脚本转换为破折号。
Dan M.

@丹 我不明白 如果要内置time,请运行time。如果需要独立的可执行文件,请运行/usr/bin/time
terdon

time据我所知,Ubuntu的默认外壳没有内置功能。我想使用内置脚本将脚本转换为具有相同行为的独立脚本。
Dan M.

@丹 然后使用time。它将调用可用的任何一个。这将是bash的内置函数,而破折号是独立的。如果使用/usr/bin/time,则它将始终以bash和破折号调用独立的。但是听起来您可能应该问一个新问题,解释所需的行为。如果您愿意,请告诉我,我会尽力帮助。
terdon

是的,但是内置和独立的语法/语义完全不同。还是谢谢你。我会问一个新的问题,如果我自己不知道该如何处理。
Dan M.

17

bashzsh壳有自己的内部time命令。你必须用

/usr/bin/time -f ...

顺便说一句,我发现使用(from zsh):

~% which  time
time: shell reserved word
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.