Shell-Script

在 bash 函式(不是命令)上使用時間

  • May 11, 2016

如何從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

引用自:https://unix.stackexchange.com/questions/282280