通常,该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)
为什么会发生这种情况?有没有办法在保持变量赋值的同时将输出分成三行?
为什么会发生这种情况?
在 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)
然而,在幕后,这些是非常不同的。