我尝试重定向 time 命令的输出,但我做不到:
$time ls > filename
real 0m0.000s
user 0m0.000s
sys 0m0.000s
在文件中,我可以看到
ls
命令的输出,而不是 time
的输出。
请解释一下为什么我不能以及如何做到这一点。
无需启动子外壳。使用代码块也可以。
{ time ls; } 2> out.txt
或
{ time ls > /dev/null 2>&1 ; } 2> out.txt
您可以使用重定向时间输出,
(time ls) &> file
因为您需要将 (time ls) 作为单个命令,以便可以使用大括号。
命令 time 将其输出发送到 STDERR (而不是 STDOUT)。这是因为随时间执行的命令通常(在本例中为 ls)输出到 STDOUT。
如果你想捕获时间的输出,则输入:
(time ls) 2> filename
仅捕获 time 的输出,但 ls 的输出在控制台上正常。如果您想将两者捕获到一个文件中,请输入:
(time ls) &> filename
2> 重定向 STDERR,&> 重定向两者。
时间是 shell 内置的,我不确定是否有办法重定向它。不过你可以使用
/usr/bin/time
相反,它肯定接受任何输出重定向。
重定向似乎不适用于
time
的原因是,当在管道前面使用时,它是 bash 保留字(不是内置字!)。重击(1):
如果时间保留字位于管道之前,则经过的时间以及 当执行时消耗的用户和系统时间被报告 管道终止。
因此,要重定向
time
的输出,可以使用大括号:
{ time ls; } 2> filename
或致电
/usr/bin/time
:
/usr/bin/time ls 2> filename
如果您不想混合
time
和命令的输出。
使用 GNU 时间,您可以使用 -o file
,例如:
/usr/bin/time -o tim grep -e k /tmp 1>out 2>err
而
tim
是时间的输出,out
和err
是来自grep
的stdout和stderr。
我使用带大括号的 stdout 和 stderr 方法的重定向来进行测试。
&>>rpt
代表这个 >>rpt 2>&1
,但更短。{ time ls a*; } &>>rpt
不是规范的用例,而是另一种方法。
可以在独立的“屏幕”终端中启动运行时间较长的简单任务,并记录输出。您甚至可以为日志指定一个唯一的名称。
这种方法主要适用于需要花费数小时并且通过 SSH 调用且需要不时“检查”的事情。优先于背景和否认。
screen -dmL time -v ./crackpassword
您将获得与终端相同的输出,但需要注意的是这是异步的。当然,它也可以是一个脚本。输出可能需要调整。
默认情况下,
time
输出进入STDERR。您可以将 time
输出写入文件,如下所示
time -o time.log ls > filename
-o
将 time
输出写入 FILE 而不是 STDERR
如果您希望
time
输出与命令的 stderr 混合在一起,那么您可以使用
time -a -o ls.err ls > ls.out 2> ls.err
-a
(与 -o
)追加而不是覆盖 FILE。
请参阅文档了解更多选项和详细信息。
注意:在某些系统上
time
是返回当前时间的内置/保留关键字。要绕过此操作,请使用以下之一
$ /usr/bin/time --help
$ env time --help
$ \time --help