Bash

命令“時間”獨立工作,但不在管道中

  • June 16, 2021

考慮以下:

# time sleep 1

real    0m1.001s
user    0m0.001s
sys     0m0.000s
# echo foo | time sleep 1
bash: time: command not found

嗯……憤怒?

好的,很明顯,當作為管道執行時,Bash 正在以某種不同的方式搜尋命令。誰能向我解釋一下有什麼區別?管道是否會禁用外殼內置程序或其他內容?(我不認為它會……但是……我看不出這是怎麼回事。)

bashshell 實現time為關鍵字。關鍵字是管道語法的一部分。

管道的語法bash是(來自手冊中標題為“管道”的部分bash):

[time [-p]] [!] command1 [ | or |& command2 ] …

由於它是pipelines 語法的time一部分,而不是 shell 內置實用程序,因此它的行為不像實用程序。例如,如果沒有額外的技巧,就不可能使用普通的 shell 重定向來重定向其輸出(參見例如我如何將 time 輸出和命令輸出重定向到同一管道?)。

當單詞time出現在bashshell 中管道開頭以外的任何其他位置時,將呼叫具有相同名稱的外部命令。time例如,當您將其放在管道符號之後時,就會發生這種情況。如果 shell 找不到外部time命令,則會生成“找不到命令”錯誤。

要使 shell 使用關鍵字僅對sleep 1管道中的命令計時,您可以使用

echo foo | (time sleep 1)

在管道右側的子外殼中,time關鍵字位於管道的開頭(單個簡單命令的管道,但仍然如此)。

還有相關的:

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