Shell-Script
在 bash 函式(不是命令)上使用時間
如何從bash 文件中測量對 bash 函式的單個呼叫。
我有一個使用命令呼叫的程序
eclipse -b col_solve.pl -e "myPred"
這個呼叫輸出一些資訊,最後一個是 SUCCESS 或 FAIL。我正在編寫一個在目錄中的一堆文件上呼叫的腳本,並且對於每個文件,輸出
- 名字
- 狀態(成功或失敗)
- 以及(使用者)執行時間。
這是我知道有效的程式碼:
我用它來獲取狀態(檢索輸出中的最後一個單詞):
stat= get_stat ( ){ stat=$(awk '{print $NF}' <<< $1); }
我用它來呼叫程序:
run_eclipse_on ( ){ get_stat "$(eclipse -b col_solve.pl -e "run(\"$1\")" )"; }
有問題的程式碼如下:
for i in `ls $1` ; #where $1 is the directory containing the files do tps=$(/usr/bin/time -f %U \ #to get just the user time [run_eclipse_on $1/$i] ); # HERE it is! echo $i::$stat::::$tps; # gives, for ex: file_name::SUCCESS::::0.20 done
罪魁禍首是呼叫函式的那一行。我嘗試用`,{,[,$(,‘和“包圍它。沒有任何效果……
有沒有可能……?
使用
time
關鍵字而不是外部命令。使用關鍵字允許您執行time
任何 shell 命令,包括函式呼叫,而不僅僅是執行程序。可以通過TIMEFORMAT
變數在一定程度上控制輸出格式。TIMEFORMAT=%2U time run_eclipse_on … echo "$i::$stat"
不過,
time
輸出會列印在自己的行上。Bash 有一個技巧:您可以TIMEFORMAT
在命令期間進行更改,這樣您就可以在其中填充更多內容。time { run_eclipse_on …; TIMEFORMAT="${i//%/%%}::${stat//%/%%}::%2U"; }
的輸出
time
列印到標準錯誤。如果您在標準輸出上需要它,只需使用2>&1
. 然而,這也將重定向列印在 stderr 上的任何命令。要保留 stderr,您可以執行一些文件描述符改組。{ time { { run_eclipse_on …; TIMEFORMAT=$stat::%2U; } 2>&3; } 2>&1; } 3>&2