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

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

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

-f: command not found

然后我尝试使用其他选项-a-o等等,但还是出现同样的错误。甚至time --version不起作用(--version: command not found)。

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

答案1

好吧,即使你不喜欢它,我也会带你再仔细读一遍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

如果是这样的话,那么很明显,使用真实的 time命令必须使用其明确路径:/usr/bin/time

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

alias time='/usr/bin/time'

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

type time

将给出以下输出:

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

答案2

因为,正如其他答案所解释的,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
    
  • 使用不同的 shell,即没有此关键字的 shell。例如sh(实际上dash在 Ubuntu 上):

    sh -c "time -f %Uuser ls >/dev/null"
    
  • 使用which,它将搜索你的$PATH(好吧,这个很傻):

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

答案3

bash和shellzsh有自己的内部time命令。你必须使用

/usr/bin/time -f ...

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

~% which  time
time: shell reserved word

相关内容