Bash 时间命令输出与环境变量分配不同

jus*_*alf 3 bash time

通常,该time命令输出三行:

> time sleep 2
real    0m2.003s
user    0m0.000s
sys     0m0.006s
Run Code Online (Sandbox Code Playgroud)

然而,当前面加上变量赋值时,输出变成一行:

> VAR="" time sleep 2
0.00user 0.00system 0:02.00elapsed 0%CPU (0avgtext+0avgdata 2060maxresident)k
0inputs+0outputs (0major+86minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?有没有办法在保持变量赋值的同时将输出分成三行?

Kam*_*ski 5

为什么会发生这种情况?

在 Bash 中time有一个保留字(关键字),它不仅可以放在前面和测量一个简单的命令;它可以测量管道。因此,它必须是第一个词。此语法仅通知 Bash 您想要测量时间;管道的其余部分仍然由 Bash 处理,就好像time不存在一样。

如果time不是第一个单词并且仍然可以被解释为命令,则它被解释为常规外部命令(甚至不是内置命令),查找$PATH并执行;例如,可以是/usr/bin/time。该工具处理其参数并根据它们构建实际的命令。

这两个实用程序以不同的格式生成输出。


有没有办法在保持变量赋值的同时将输出分成三行?

是的。您可以用作time第一个单词,因此它会被解释为关键字:

time VAR="" sleep 2
Run Code Online (Sandbox Code Playgroud)

请注意,两种实现都支持-p将输出格式更改为POSIX 指定的格式(实际上-pPOSIX 需要对其本身的支持)。这意味着以下两个命令将以相同的格式生成输出:

time -p VAR="" sleep 2
VAR="" time -p sleep 2
Run Code Online (Sandbox Code Playgroud)

然而,在幕后,这些是非常不同的。