如何重定向“时间”命令的输出?

Posted

技术标签:

【中文标题】如何重定向“时间”命令的输出?【英文标题】:How can I redirect the output of the "time" command? 【发布时间】:2011-01-25 10:10:11 【问题描述】:

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

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

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

【问题讨论】:

我认为应该是超级用户。 这个问题的答案不仅对程序员感兴趣,对其他高级用户也很感兴趣:superuser.com Is there a way to redirect time output to file in Linux的可能重复 【参考方案1】:

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

(time ls) &> file

因为您需要将 (time ls) 作为单个命令,因此您可以使用大括号。

【讨论】:

是的,很好,但问题是他们是怎么做到的? time 命令将参数作为命令。但是括号会将其分组为一个命令。例如:time ls > file1.txt 在参数中,0 = time 1 = "ls > file1.txt" 并且 time 命令在 stderr 中打印输出。所以你可以使用 (time ls) 2> file 请澄清&>,我在哪里可以了解这些? @hello_there_andy &>file 类似于 >file 2>&1。它同时指示标准输出和标准错误。【参考方案2】:

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

【讨论】:

/usr/bin/time --输出文件名ls 内置时间与输出重定向配合得很好。它只在 STDERR 上输出,而不是在 STDOUT 上。 问题是内置命令是在 shell 环境本身中执行的,而不是子 shell。由于你的 shell 的 stderr 通常连接到终端,重定向不会做任何事情。要重定向内置时间,我相信您必须执行bash time mycmd 2>file 之类的操作。或者如前所述,直接致电/usr/bin/time 也可以不指定完整路径使用非内置:***.com/questions/29540540/…【参考方案3】:

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

如果你想捕捉时间的输出,那么输入:

(time ls) 2> filename

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

(time ls) &> filename

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

【讨论】:

这个答案实际上回答了 为什么 OP 的重定向不起作用,这是 OP 提出的问题之一。没有其他人解决这个问题。 如何通过这个管道连接到另一个进程?【参考方案4】:

无需启动子外壳。使用代码块也可以。

 time ls;  2> out.txt

 time ls > /dev/null 2>&1 ;  2> out.txt

【讨论】:

同意,最佳答案。让您可以选择放弃 ls 结果并获得时间。谢谢ghostdog74 当没有任何东西可以重定向“hostent”命令的输出时,这适用于 AIX。谢谢! 请澄清2>。我在哪里可以了解这些? 如果我同时想要 > 和 2> 怎么办?【参考方案5】:

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

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

tim 是时间的输出,outerr 是来自grep 的标准输出和标准错误。

【讨论】:

【参考方案6】:

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

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

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

 time ls;  2> filename

或致电/usr/bin/time:

/usr/bin/time ls 2> filename

【讨论】:

【参考方案7】:

我使用带有大括号的 stdout 和 stderr 方法的重定向进行测试。&>>rpt 代表这个 >>rpt 2>&1 但更短。 大括号将在当前 shell 中执行命令。参见:man bash

 time ls a*;  &>>rpt

【讨论】:

以上是关于如何重定向“时间”命令的输出?的主要内容,如果未能解决你的问题,请参考以下文章

Linux重定向(输入重定向 | 输出重定向)

显示 Windows 命令提示符输出并将其重定向到文件

如何将 time 命令的输出重定向到 Linux 中的文件?

如何在脚本本身内重定向整个 shell 脚本的输出?

如何理解这个重定向命令? [复制]

如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?