有没有办法在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和命令放在一组括号中进行计时。

例如,下面的lsls的结果和时间结果写入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