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

ed8*_*d82 189 linux bash time

关于Linux上的计时程序的一个小问题:time命令允许测量程序的执行时间:

[ed@lbox200 ~]$ time sleep 1

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

哪个工作正常.但是如果我尝试将输出重定向到文件,它就会失败.

[ed@lbox200 ~]$ time sleep 1 > time.txt

real    0m1.004s
user    0m0.001s
sys     0m0.004s

[ed@lbox200 ~]$ cat time.txt 
[ed@lbox200 ~]$ 
Run Code Online (Sandbox Code Playgroud)

我知道还有其他的时间实现,使用-o选项来编写文件,但我的问题是关于没有这些选项的命令.

有什么建议 ?

Jan*_*ary 246

尝试

{ time sleep 1 ; } 2> time.txt
Run Code Online (Sandbox Code Playgroud)

它将"time"的STDERR和你的命令结合到time.txt中

或者使用

{ time sleep 1 2> sleep.stderr ; } 2> time.txt
Run Code Online (Sandbox Code Playgroud)

它将STDERR从"sleep"放入文件"sleep.stderr",只有"time"的STDERR进入"time.txt"

  • 如果你想用grep之类的时间来读取stdout,那就试试`{time sleep 1; } 2>&1 | grep real`.这会将stderr发送到stdout,然后grep可以读取. (10认同)
  • 不要忘记';' 关闭'}'之前的字符,如果没有(我做了,并且...想知道为什么不工作:)将无法工作:) (9认同)
  • 是的,但你必须把它放在大括号中,否则重定向将成为`time`评估命令的一部分. (7认同)
  • @Daniel您总是可以单独重定向内部命令输出(即{time sleep 1 2> sleepStdErr.txt;} 2> time.txt),这样只会获得时间输出.我不确定是否有办法独立获得它. (5认同)
  • 谢谢,这正好回答了我的问题。如果我理解正确,可以从 stderr 获得 time 命令的结果吗? (2认同)

sam*_*hen 36

包裹time和命令您在一组括号中计时.

例如,以下时间ls将结果ls和时间结果写入outfile:

$ (time ls) > outfile 2>&1
Run Code Online (Sandbox Code Playgroud)

或者,如果您想将命令的输出与捕获的输出分开time:

$ (time ls) > ls_results 2> time_results
Run Code Online (Sandbox Code Playgroud)

  • 这里不必引入子shell. (12认同)
  • @sampson-chen 这只有效,因为 ls 不会向 stderr 写入任何内容,对吧?如果命令同时写入 stdout 和 stderr,如何将“time”的输出与要运行的命令的输出“分开”? (2认同)

cma*_*ter 30

简单.GNU time实用程序有一个选项.

但是你必须确保你没有使用你的shell的内置time命令,至少bash内置不提供该选项!这就是为什么你需要提供time实用程序的完整路径:

/usr/bin/time -o time.txt sleep 1
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用非内置而不指定完整路径:/sf/ask/2067837831/ (2认同)

Mar*_*ark 13

如果您关心命令的错误输出,您可以在使用内置时间命令的同时将它们分开.

{ time your_command 2> command.err ; } 2> time.log
Run Code Online (Sandbox Code Playgroud)

要么

{ time your_command 2>1 ; } 2> time.log
Run Code Online (Sandbox Code Playgroud)

如您所见,命令的错误转到文件(因为stderr用于time).

不幸的是你不能把它发送到另一个句柄(如3>&2),因为它不会再存在于其他句柄之外{...}

也就是说,如果你可以使用GNU时间,那就去做@Tim Ludwinski所说的.

\time -o time.log command
Run Code Online (Sandbox Code Playgroud)


小智 7

由于'time'命令的输出是错误输出,因此将其重定向为标准输出将更直观地进行进一步处理.

{ time sleep 1; } 2>&1 |  cat > time.txt
Run Code Online (Sandbox Code Playgroud)


ali*_*oar 6

&>out time command >/dev/null
Run Code Online (Sandbox Code Playgroud)

在你的情况下

&>out time sleep 1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

然后

cat out
Run Code Online (Sandbox Code Playgroud)

  • 优雅的想法,但导致 shell 不使用其内置命令。如果您没有安装真正的“time”二进制文件,“out”将包含类似“bash: time: command not find”的内容。 (4认同)

Tim*_*ski 6

如果您使用的是GNU时间而不是内置的bash,请尝试

time -o outfile command
Run Code Online (Sandbox Code Playgroud)

(注意:GNU时间格式与bash内置格式略有不同).


Loc*_*ane 5

我最终使用了:

/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
Run Code Online (Sandbox Code Playgroud)
  • 其中“a”是附加
  • 其中“o”前面是要附加到的文件名
  • 其中“f”是具有类似 printf 语法的格式
  • 其中“%E”产生 0:00:00;时:分:秒
  • 我必须调用 /usr/bin/time 因为 bash“时间”正在践踏它并且没有相同的选项
  • 我只是想将输出输出到文件,与OP不一样