Bash

如何有條件地通過“時間”傳遞子shell?

  • May 6, 2016

我有一個 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 除外)-pbash但可以使用TIMEFORMAT變數 in設置格式bash。(該shopt部分也是bash特定的,其他外殼通常不需要)。

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