有没有办法在Linux中redirect时间输出到文件
关于Linux上的计时程序只是一个小问题:time命令允许测量程序的执行时间:
[ed@lbox200 ~]$ time sleep 1 real 0m1.004s user 0m0.000s sys 0m0.004s
哪个工作正常。 但是,如果我尝试将输出redirect到一个文件,它会失败。
[ed@lbox200 ~]$ time sleep 1 > time.txt real 0m1.004s user 0m0.001s sys 0m0.004s [ed@lbox200 ~]$ cat time.txt [ed@lbox200 ~]$
我知道有其他的实现时间与选项-o写一个文件,但我的问题是关于没有这些选项的命令。
有什么build议么 ?
尝试
{ time sleep 1 ; } 2> time.txt
它将“时间”的STDERR和你的命令组合成time.txt
或者使用
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
它将STDERR从“睡眠”放入文件“sleep.stderr”,只有从“时间”开始的STDERR进入“time.txt”
将time
和命令放在一组括号中进行计时。
例如,下面的ls
将ls
的结果和时间结果写入outfile
:
$ (time ls) > outfile 2>&1
或者,如果您想要从捕获的输出中分离命令的输出:
$ (time ls) > ls_results 2> time_results
简单。 GNU time
工具有一个选项。
但是你必须确保你没有使用你的shell的内置time
命令,至lessbash
内置函数不提供这个选项! 这就是为什么你需要给time
实用程序的完整path:
/usr/bin/time -o time.txt sleep 1
如果您关心命令的错误输出,则可以在使用内置时间命令的情况下将它们分开。
{ time your_command 2> command.err ; } 2> time.log
要么
{ time your_command 2>1 ; } 2> time.log
正如你看到的命令的错误去一个文件(因为stderr
用于time
)。
不幸的是,你不能把它发送到另一个句柄(比如3>&2
),因为这个句柄在{...}
也就是说,如果你可以使用GNU时间,那就做@Tim Ludwinski说的。
\time -o time.log command
如果您使用的是GNU时间而不是内置的bash,请尝试
time -o outfile command
(注意:GNU时间格式与内置bash有所不同)。
由于“时间”命令的输出是错误输出,因此将其redirect为标准输出将更直观地进行进一步处理。
{ time sleep 1; } 2>&1 | cat > time.txt
&>out time command >/dev/null
在你的情况
&>out time sleep 1 >/dev/null
然后
cat out
#!/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,并且最终的stream水线已经将其stderr恢复到真正的stderr。
如果您不想触摸原始进程的stdout和stderr,则可以将stderrredirect到文件描述符3并返回:
$ { 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)来监控运行时间:
#!/bin/bash echo "[$(date)]" "$@" >> /my/runtime.log { time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log