2012-11-13 45 views
119

只是一個小問題提交關於Linux的定時方案:time命令允許 測量程序的執行時間:有沒有辦法來重定向時間輸出的Linux

[[email protected] ~]$ time sleep 1 

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

工作正常。但是如果我嘗試將輸出重定向到一個文件,它會失敗。

[[email protected] ~]$ time sleep 1 > time.txt 

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

[[email protected] ~]$ cat time.txt 
[[email protected] ~]$ 

我知道有其他的時間實現與-o寫一個文件,但 我的問題是關於沒有這些選項命令的選項。

有什麼建議嗎?

+1

可能重複[bash腳本在文件中寫入執行時間](http://stackoverflow.com/questions/13176611/bash-script-write-executing-time-in-a-file ),而且我不相信這是第一個這樣的問題。 –

+0

這是http://stackoverflow.com/questions/2408981/how-can-i-redirect-the-output-of-the-time-command的副本 – codeforester

回答

170

嘗試

{ time sleep 1 ; } 2> time.txt 

相結合的「時間」和STDERR您的命令到TIME.TXT

或者使用

{ time sleep 1 2> sleep.stderr ; } 2> time.txt 

從提出STDERR從「睡眠」到文件「sleep.stderr」,只有STDERR 「時間」 進入 「TIME.TXT」

+1

謝謝,這正是我的問題。如果我正確理解,時間命令的結果可以從stderr中獲得? – ed82

+7

是的,但你必須把它放在大括號內,否則重定向將成爲'時間'評估命令的一部分。 – January

+0

即使大括號更新,也不是有效的答案。使用生成錯誤輸出的命令將顯示在上述語法中,time.txt將包含命令的錯誤和時間輸出。看起來最初的問題是詢問如何從_any_命令輸出獨立捕獲時間輸出。我還沒有解決的一個問題。 – Daniel

26

換行time和您在一組括號中計時的命令。

例如,下列時間ls和寫入的ls結果和定時的結果合併到outfile

$ (time ls) > outfile 2>&1 

或者,如果你想的命令的輸出從所捕獲的分離從time輸出:

$ (time ls) > ls_results 2> time_results 
+11

這裏沒有必要引入子shell。 – January

+1

@ sampson-chen只有這樣才行,因爲ls並沒有向stderr寫任何東西?如果命令寫入stdout和stderr,如何將「時間」的輸出與要運行的命令的輸出「分離」? –

2
&>out time command >/dev/null 

你的情況

&>out time sleep 1 >/dev/null 

然後

cat out 
+3

優雅的想法,但會導致shell不行使用它的內置命令。如果你沒有安裝真正的'time'二進制文件,'out'將包含'bash:time:command not found'之類的東西。 – scy

+0

另外,GNU時間的格式與bash內建的格式不同,導致自動解析出現問題。 – Guss

4

如果您正在使用GNU的時間,而不是bash的內置,嘗試

time -o outfile command 

(注:GNU時間格式稍有不同,它內置在bash)。

+1

這個,謝謝。你可以使用'\ time -o outfile命令'(用'\')來使用GNU而不是內置的。 – Mark

12

如果您關心命令的錯誤輸出,您可以在仍使用內置時間命令的情況下將它們分開。

{ 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 
22

簡單。 GNU time實用程序有一個選項。

但是你必須保證你使用shell的內置命令time,至少bash內置不提供選項!這就是爲什麼你需要給time實用程序的完整路徑:

/usr/bin/time -o time.txt sleep 1 
1
#!/bin/bash 

set -e 

_onexit() { 
    [[ $TMPD ]] && rm -rf "$TMPD" 
} 

TMPD="$(mktemp -d)" 
trap _onexit EXIT 

_time_2() { 
    "[email protected]" 2>&3 
} 

_time_1() { 
    time _time_2 "[email protected]" 
} 

_time() { 
    declare time_label="$1" 
    shift 
    exec 3>&2 
    _time_1 "[email protected]" 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 

這還沒有產卵子殼的利益,而最終的管道有它的標準錯誤恢復到真正的標準錯誤。

3

由於「時間」命令的輸出是錯誤輸出,因此將其重定向爲標準輸出會更加直觀,可以進行進一步處理。

{ time sleep 1; } 2>&1 | cat > time.txt 
0

如果你不想接觸到原件進程的輸出和錯誤,你可以重定向標準錯誤文件描述符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)]" "[email protected]" >> /my/runtime.log 

{ time { "[email protected]" 2>&3; }; } 3>&2 2>> /my/runtime.log 
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的「時間」被踐踏而且沒有相同的選項
  • 我只是想讓輸出文件,而不是與OP
相關問題