如何重定向"time"命令的输出?

abu*_*ker 89 unix shell time io-redirection

我试图重定向时间命令的输出,但我不能:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

在文件中,我可以看到ls命令的输出,而不是time.请解释一下,为什么我不能以及如何做到这一点.

gho*_*g74 120

无需启动子shell.使用代码块也可以.

{ time ls; } 2> out.txt
Run Code Online (Sandbox Code Playgroud)

要么

{ time ls > /dev/null 2>&1 ; } 2> out.txt
Run Code Online (Sandbox Code Playgroud)

  • 如果我同时想要>和2>,我该怎么做? (3认同)

sga*_*esh 98

您可以使用重定向时间输出,

(time ls) &> file
Run Code Online (Sandbox Code Playgroud)

因为你需要把(时间ls)作为一个命令,所以你可以使用大括号.

  • time命令在stderr中打印输出.所以你可以使用(时间ls)2>文件 (6认同)
  • 澄清`&>`请,我在哪里可以了解这些? (3认同)
  • @hello_there_andy `&>file` 类似于 `>file 2>&1`。它同时引导 stdout 和 stderr。 (3认同)
  • time命令将参数作为命令.但括号会将其分组为一个命令.例如:时间ls> file1.txt在参数中,0 =时间1 ="ls> file1.txt" (2认同)

Mne*_*nth 24

命令时间将其输出发送到STDERR(而不是STDOUT).这是因为正常执行的命令(在本例中为ls)输出到STDOUT.

如果要捕获时间输出,请键入:

(time ls) 2> filename
Run Code Online (Sandbox Code Playgroud)

它仅捕获时间输出,但ls的输出正常到控制台.如果要在一个文件中捕获两者,请键入:

(time ls) &> filename
Run Code Online (Sandbox Code Playgroud)

2>重定向STDERR,&>重定向两者.


Mic*_*hař 9

时间是内置的,我不确定是否有办法重定向它.但是你可以使用 /usr/bin/time,它肯定接受任何输出重定向.

  • 内置时间适用于输出重定向.它仅在STDERR上输出,而不在STDOUT上输出. (4认同)

Din*_*hen 7

如果您不想混合time命令的输出。使用 GNU 时间,您可以使用-o file

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err
Run Code Online (Sandbox Code Playgroud)

whiletim是时间的输出,outerr来自 的 stdout 和 stderr grep


use*_*062 5

重定向似乎不起作用的原因time是它在管道前使用时是 bash 保留字(不是内置字!)。重击(1):

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

因此,要重定向 的输出time,请使用花括号:

{ time ls; } 2> filename
Run Code Online (Sandbox Code Playgroud)

或致电/usr/bin/time

/usr/bin/time ls 2> filename
Run Code Online (Sandbox Code Playgroud)