Bash
如何有條件地通過“時間”傳遞子shell?
我有一個 Vagrant 盒子的設置腳本,我曾經用
time
. 現在我想有條件地啟用或禁用時間測量。例如,以前的一行看起來像:
time (apt-get update > /tmp/last.log 2>&1)
現在我想我可以簡單地做這樣的事情:
MEASURE_TIME=true [[ $MEASURE_TIME = true ]] && TIME="time --format=%e" || TIME="" $TIME (apt-get update > /tmp/last.log 2>&1)
但這不起作用:
syntax error near unexpected token `apt-get' `$TIME (apt-get update > /tmp/last.log 2>&1)'
這裡有什麼問題?
為了能夠對子shell計時,您需要
time
關鍵字,而不是命令。關鍵字是語言的
time
一部分,僅在按字面輸入並作為命令的第一個單詞時才被辨識(在 的情況下ksh93
,下一個標記不以 a 開頭-
)。即使進入"time"
也行不通(更不用說$TIME
將被視為對time
命令的呼叫)。您可以在此處使用在執行另一輪解析之前擴展的別名(這樣可以讓 shell 辨識該
time
關鍵字):shopt -s expand_aliases alias time_or_not= TIMEFORMAT=%E MEASURE_TIME=true [[ $MEASURE_TIME = true ]] && alias time_or_not=time time_or_not (apt-get update > /tmp/last.log 2>&1)
time
關鍵字不帶選項( in 除外)-p
,bash
但可以使用TIMEFORMAT
變數 in設置格式bash
。(該shopt
部分也是bash
特定的,其他外殼通常不需要)。