我知道time
將發送定時統計輸出到stderr
。但不知何故,我無法抓住它無論是在bash腳本或者通過將重定向文件:bash時間輸出處理
time $cmd 1>/dev/null 2>file
$output=`cat file`
或者
$output=`time $cmd 1>/dev/null`
我只對感興趣的時機,而不是命令的直接輸出。我已經閱讀了一些帖子,但仍然沒有找到可行的解決方案。有什麼建議麼?
謝謝!
我知道time
將發送定時統計輸出到stderr
。但不知何故,我無法抓住它無論是在bash腳本或者通過將重定向文件:bash時間輸出處理
time $cmd 1>/dev/null 2>file
$output=`cat file`
或者
$output=`time $cmd 1>/dev/null`
我只對感興趣的時機,而不是命令的直接輸出。我已經閱讀了一些帖子,但仍然沒有找到可行的解決方案。有什麼建議麼?
謝謝!
嘗試:
(time $cmd) 1>/dev/null 2>file
以便(time $cmd)
在子外殼環境中執行,然後您可以重定向其輸出。
(使用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.
Upvoted兩個,但我會添加到您的答案,您需要使用時間二進制或''時間「的完整路徑引用,使其使用可執行文件,而不是bash內建。 –
+1,但請注意,您可以只用'\ time'來調用可執行文件版本。 – Sorpigal
我有一個類似的問題,我想進行臺式優化。這個想法是多次運行該程序,然後輸出運行持續時間的統計數據。
我用以下命令行:
第一次運行:(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
輸出格式。它也可以很容易地擴展到包含真實和系統統計數據。
更好地說'(時間$ cmd 2>/dev/null 1>&2)2>捕獲',以便命令中的stderr也被扔掉。 – Sorpigal