2009-11-19 28 views
1

我正在更新作爲程序測試工具的bash腳本。 以前,我有這條線在腳本工作完美($BIN_FILE設置爲相對路徑來測試二進制的存在):

$BIN_FILE $BIN_OPTS &> $LOG_FILE 

於是我決定添加一些「性能測試」:

time $BIN_FILE $BIN_OPTS &> $LOG_FILE" 

這一切都很完美,但是當一次運行很多測試時,腳本的輸出對於所有那些「真實,用戶,系統」來說太擁擠了。現在我將第二個參數傳遞給腳本,這會導致$ TIME變量賦予值'time'。但是,

$TIME $BIN_FILE $BIN_OPTS &> $LOG_FILE 

只是不起作用。唯一的工作選擇似乎是

eval "$TIME $BIN_FILE $BIN_OPTS &> $LOG_FILE" 

但它是醜陋的。

爲什麼不

$TIME $BIN_FILE $BIN_OPTS &> $LOG_FILE 

工作?有沒有更好看的解決方案,然後用eval?另外,關於可移植性 - 我應該使用bash的內部'時間',還是調用GNU/usr/bin/time?

回答

3

time是bash中的保留字。它必須明確寫入,因爲它在解析「simple commands」之前進行了解析,因此在變量替換之前進行解析。例如,你不能以這種方式使用內置time

cat long-file | time sort 

它必須是:

time cat long-file | sort 

這裏bash將測量整個管道花費的時間。

GNU time是一個簡單的二進制文件,所以可以用它的方式來使用它......它可以在流水線中使用。但它並不總是安裝,所以我想你最好使用內建。

我想你想省略time在某些特定情況下,因爲你想變量替代。如果是這樣,你可以用GNU time,eval或某種if..fi結構,但你絕對不能以你想要的方式使用內建。

如果你想更便攜,你應該使用它的-p選項在不同的實現下獲得相同的輸出。見f.e. OpenGroup's time description。然後,無論您選擇哪種實現,它都應該以相同的方式運行(只要符合POSIX標準)。

1

您可能會發現它有助於使用較短格式的time輸出:

$ /usr/bin/time -f "Real %E" sleep 1 
Real 0:01.02 
$ TIMEFORMAT="Real %R" 
$ time sleep 1  # Bash builtin 
Real 1.027 

的任一版本的time輸出可以進一步定製(少所以Bash的內置)。

+0

謝謝,我現在沒有,除了唯一接受的-p選項,我可以使用TIMEFORMAT修改Bash內置顯示格式。 – chronos 2009-11-20 01:08:21