2011-11-29 87 views
1

我知道time將發送定時統計輸出到stderr。但不知何故,我無法抓住它無論是在bash腳本或者通過將重定向文件:bash時間輸出處理

time $cmd 1>/dev/null 2>file 
$output=`cat file` 

或者

$output=`time $cmd 1>/dev/null` 

我只對感興趣的時機,而不是命令的直接輸出。我已經閱讀了一些帖子,但仍然沒有找到可行的解決方案。有什麼建議麼?

謝謝!

回答

4

嘗試:

(time $cmd) 1>/dev/null 2>file 

以便(time $cmd)在子外殼環境中執行,然後您可以重定向其輸出。

+0

更好地說'(時間$ cmd 2>/dev/null 1>&2)2>捕獲',以便命令中的stderr也被扔掉。 – Sorpigal

3

(使用GNU時間/usr/bin/time而不是bash的內置)(感謝@邁克爾Krelin)
(或調用爲\time)(感謝@Sorpigal,如果我知道這個我已經完全忘記)

怎麼樣使用-o也許-a命令行選項:

-o FILE, --output=FILE 
     Do not send the results to stderr, but overwrite the specified file. 

-a, --append 
     (Used together with -o.) Do not overwrite but append. 
+0

Upvoted兩個,但我會添加到您的答案,您需要使用時間二進制或''時間「的完整路徑引用,使其使用可執行文件,而不是bash內建。 –

+1

+1,但請注意,您可以只用'\ time'來調用可執行文件版本。 – Sorpigal

0

我有一個類似的問題,我想進行臺式優化。這個想法是多次運行該程序,然後輸出運行持續時間的統計數據。

我用以下命令行:

第一次運行:(time ./myprog)2>times.log

下運行:(time ./myprog)2>>times.log

注意,我(的bash?)內置於time輸出統計形式:

real 0m2.548s 
    user 0m7.341s 
    sys  0m0.007s 

然後,我跑到下面的Perl腳本來檢索統計:

#!/usr/bin/perl -w 

    open FH, './times.log' or die "ERROR: ", $!; 

    my $useracc1 = 0; 
    my $useracc2 = 0; 
    my $usermean = 0; 
    my $uservar = 0; 
    my $temp = 0; 

    while(<FH>) 
    { 
     if("$_" =~ /user/) 
     { 
      if("$_" =~ /(\d+)m(\d{1,2})\.(\d{3})s/) 
      { 
       $usercpt++; 
       $temp = $1*60 + $2 + $3*0.001; 
       $useracc1 += $temp; 
       $useracc2 += $temp**2; 
      } 
     } 
    } 

    if($usercpt ne 0) 
    { 
     $usermean = $useracc1/$usercpt; 
     $userdev = sqrt($useracc2/$usercpt - $usermean**2); 
     $usermean = int($usermean*1000)/1000; 
     $userdev = int($userdev*1000)/1000; 
    } 
    else 
    { 
     $usermean = "---"; 
     $userdev = "---"; 
    } 

    print "User: ", $usercpt, " runs, avg. ", $usermean, "s, std.dev. ", $userdev,"s\n"; 

當然,正則表達式可能需要adjustements取決於你time輸出格式。它也可以很容易地擴展到包含真實和系統統計數據。