“grep”不适用于“时间”?

Nis*_*sba 1 grep time

为什么time ls | grep real输出这个

real    0m0.002s
user    0m0.000s
sys     0m0.002s
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

real    0m0.002s
Run Code Online (Sandbox Code Playgroud)

如果我输入

echo -e 'real\t0m0.002s\nuser\t0m0.000s\nsys\t0m0.002s\n' | grep real
Run Code Online (Sandbox Code Playgroud)

我得到了我的期望,即

real    0m0.002s
Run Code Online (Sandbox Code Playgroud)

我发现这有效

(time ls)  2>&1 > /dev/null | grep real
Run Code Online (Sandbox Code Playgroud)

这个命令有什么作用?

Dav*_*ill 5

为什么time ls | grep real不能按预期工作。

time是一个bash保留字,其行为与/usr/bin/time.

如果时间保留字位于管道之前,则在管道终止时报告其执行所消耗的用户和系统时间。

bash(1):GNU Bourne-Again SHell - Linux 手册页

此外,time输出到标准错误而不是标准输出。

使用以下命令:

(time ls) 2>&1 >/dev/null | grep real 
Run Code Online (Sandbox Code Playgroud)

笔记:

  • ()timels命令在一起(所以这些命令会首先评估)

  • 2>&1 >/dev/null首先将 stderr 重定向到 stdout(即管道),然后将 stdout 重定向到/dev/null.

    所以 stderr 进入管道而 stdout 无处可去。


进一步阅读