为什么 `time` 对 `echo` 不起作用?

Why does `time` not work on `echo`?

time 似乎在我的系统上正常工作:

➜  ~ time touch tmp.txt
touch tmp.txt  0.00s user 0.00s system 54% cpu 0.007 total

然而,当我尝试 time echo.

时,它的输出似乎被抑制了
➜  ~ time echo 

并使情节更复杂:它似乎恢复了测量 echo 的能力,前提是我将 echo 放入管道中:

➜  ~ time echo  | xxd     
00000000: f09f 8d94 0a                             .....
echo   0.00s user 0.00s system 38% cpu 0.002 total
xxd  0.00s user 0.00s system 88% cpu 0.003 total

这是怎么回事? echo 是否正在输出到 time 最喜欢的流,替换它的报告?

奖励积分:是否有某种方法(例如流重定向)使 time echo 输出通常的报告?


编辑: 一些评论者指出我正在使用 zsh。当时我没有注意到这一点,但这解释了很多。

bash 使用普通可执行文件执行 timeecho.

bash-3.2$ which echo
/usr/local/opt/coreutils/libexec/gnubin/echo
bash-3.2$ which time
/usr/bin/time

(看起来我使用的是 echo 的 GNU 版本,而不是 Mac OS X 附带的大概 BSD 版本 /bin/echo。 =29=]

zsh 提供了更特别的东西:

➜  ~ which echo
echo: shell built-in command
➜  ~ which time
time: shell reserved word

这些都不是普通的可执行文件。很有意思!

当您将内置 time(测量完整管道)与另一个内置命令(如 echotrue)结合使用时,似乎会发生这种情况。

奇怪的是,我在 zshall 手册页中找不到任何提及。

要解决这个问题,运行 这个:

time command echo 

command预命令修饰符调用外部回显而不是内置回显。