Bash
命令“時間”獨立工作,但不在管道中
考慮以下:
# time sleep 1 real 0m1.001s user 0m0.001s sys 0m0.000s # echo foo | time sleep 1 bash: time: command not found
嗯……憤怒?
好的,很明顯,當作為管道執行時,Bash 正在以某種不同的方式搜尋命令。誰能向我解釋一下有什麼區別?管道是否會禁用外殼內置程序或其他內容?(我不認為它會……但是……我看不出這是怎麼回事。)
bash
shell 實現time
為關鍵字。關鍵字是管道語法的一部分。管道的語法
bash
是(來自手冊中標題為“管道”的部分bash
):[time [-p]] [!] command1 [ | or |& command2 ] …
由於它是pipelines 語法的
time
一部分,而不是 shell 內置實用程序,因此它的行為不像實用程序。例如,如果沒有額外的技巧,就不可能使用普通的 shell 重定向來重定向其輸出(參見例如我如何將time
輸出和命令輸出重定向到同一管道?)。當單詞
time
出現在bash
shell 中管道開頭以外的任何其他位置時,將呼叫具有相同名稱的外部命令。time
例如,當您將其放在管道符號之後時,就會發生這種情況。如果 shell 找不到外部time
命令,則會生成“找不到命令”錯誤。要使 shell 使用關鍵字僅對
sleep 1
管道中的命令計時,您可以使用echo foo | (time sleep 1)
在管道右側的子外殼中,
time
關鍵字位於管道的開頭(單個簡單命令的管道,但仍然如此)。還有相關的: