Bash“time”內建字串不執行

Bash“time”內建字串不執行
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

這裡發生了什麼事?這不是 shell 內建函數不起作用的問題,因為這是有效的:

$ cmd2='echo wef'
$ $cmd2
wef

有任何想法嗎?

編輯:我發現了一個差異:

$ type time
time is a shell keyword

對比:

$ type echo
echo is a shell builtin

所以現在的問題是 - 為什麼內建函數可以在字串中工作而關鍵字卻不能?

答案1

time作為一個GNU 重擊關鍵字有一個非常具體的位置,可以在其中接受,例如,請參閱命令管道構造的語法:

管道的格式是 [time [-p]] [!] command1 [| command2 ...]

這確實對擴展之外的關鍵字位置進行了硬編碼(如命令N將是參數和變數展開的地方)。事實上,語義也適用於整個管道,而不是命令,因此這可能是它必須是關鍵字的原因。

有一個內建的 shell times(在 POSIX 中特殊內建),為此,擴展有效,因為第一個單字可以是可執行檔或內建的 shell。

或者GNU 核心工具 包含/bin/time可執行檔。

事實上time是沒有保留字POSIX 外殼(儘管 bash 可以識別它POSIX模式無論如何(除非-出於非顯而易見的原因遵循))。

在表達式內部eval關鍵字被辨識為巴什,因此這可以用於透過時間分析動態增強命令。 (然而,另一方面,它確實需要額外一輪引用)

答案2

不要使用 cmd='time sleep 2' 嘗試將其用作 cmd='/usr/bin/time sleep 2' 來取得即時命令。

您可以在 man time 中閱讀以下內容:

bash shell 的使用者需要使用明確路徑才能執行外部時間命令,而不是 shell 內建變體。在時間安裝在 /usr/bin 中的系統上,第一個範例將變為 /usr/bin/time wc /etc/hosts

相關內容