How to redirect the output of the time command to a file in Linux?
关于Linux上的计时程序的一个小问题:时间命令允许
衡量程序的执行时间:
1 2 3 4 5 | [ed@lbox200 ~]$ time sleep 1 real 0m1.004s user 0m0.000s sys 0m0.004s |
哪个工作正常。 但是如果我尝试将输出重定向到文件,它就会失败。
1 2 3 4 5 6 7 8 | [ed@lbox200 ~]$ time sleep 1 > time.txt real 0m1.004s user 0m0.001s sys 0m0.004s [ed@lbox200 ~]$ cat time.txt [ed@lbox200 ~]$ |
我知道还有其他的时间实现,使用-o选项来编写文件但是
我的问题是关于没有这些选项的命令。
有什么建议 ?
尝试
1 | { time sleep 1 ; } 2> time.txt |
它将"time"的STDERR和你的命令结合到time.txt中
或者使用
1 | { time sleep 1 2> sleep.stderr ; } 2> time.txt |
它将STDERR从"sleep"放入文件"sleep.stderr",只有"time"的STDERR进入"time.txt"
用一组括号中的
例如,以下时间
1 | $ (time ls) > outfile 2>&1 |
或者,如果您想将命令的输出与
1 | $ (time ls) > ls_results 2> time_results |
简单。 GNU
但是你必须确保你没有使用你的shell的内置
1 | /usr/bin/time -o time.txt sleep 1 |
如果您关心命令的错误输出,您可以在使用内置时间命令的同时将它们分开。
1 | { time your_command 2> command.err ; } 2> time.log |
要么
1 | { time your_command 2>1 ; } 2> time.log |
如您所见,命令的错误转到文件(因为
不幸的是你无法将它发送到另一个句柄(如
也就是说,如果你可以使用GNU时间,那就去做@Tim Ludwinski所说的。
1 | \time -o time.log command |
由于'time'命令的输出是错误输出,因此将其重定向为标准输出将更直观地进行进一步处理。
1 | { time sleep 1; } 2>&1 | cat > time.txt |
如果您使用的是GNU时间而不是内置的bash,请尝试
1 | time -o outfile command |
(注意:GNU时间格式与bash内置格式略有不同)。
我最终使用:
1 | /usr/bin/time -ao output_file.txt -f"Operation took: %E" echo lol |
- 附加"a"的地方
- 其中"o"由要追加的文件名继续
- 其中"f"是具有类似printf语法的格式
- "%E"产生0:00:00的地方;小时:分钟:秒
- 我不得不调用/ usr / bin / time因为bash"time"正在践踏它并且没有相同的选项
- 我只是想把输出输出到文件,而不是像OP那样
1 | &>out time command >/dev/null |
在你的情况下
1 | &>out time sleep 1 >/dev/null |
然后
1 | cat out |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/bin/bash set -e _onexit() { [[ $TMPD ]] && rm -rf"$TMPD" } TMPD="$(mktemp -d)" trap _onexit EXIT _time_2() { "$@" 2>&3 } _time_1() { time _time_2"$@" } _time() { declare time_label="$1" shift exec 3>&2 _time_1"$@" 2>"$TMPD/timing.$time_label" echo"time[$time_label]" cat"$TMPD/timing.$time_label" } _time a _do_something _time b _do_another_thing _time c _finish_up |
这样做的好处是不会产生子shell,最后的管道将它的stderr恢复到真正的stderr。
如果您使用的是
1 | /usr/bin/time --output=outfile -p $SHELL -c 'your command' |
例如:
1 | /usr/bin/time --output=outtime.txt -p csh -c 'cat file' |
如果您不想触摸原始进程'stdout和stderr,可以将stderr重定向到文件描述符3并返回:
1 2 3 4 5 6 7 8 | $ { time { perl -le"print 'foo'; warn 'bar';" 2>&3; }; } 3>&2 2> time.out foo bar at -e line 1. $ cat time.out real 0m0.009s user 0m0.004s sys 0m0.000s |
你可以使用它作为包装器(例如cronjobs)来监视运行时:
1 2 3 4 5 | #!/bin/bash echo"[$(date)]""$@">> /my/runtime.log { time {"$@" 2>&3; }; } 3>&2 2>> /my/runtime.log |