我們如何才能讓“時間”應用於管道或其組件?
time command1 | command2
time
適用於command1
或?command1 | command2
如果您的答案是兩者之一,您將如何指定另一個?您能否根據 bash 的語法或 shell 如何解釋命令來解釋您的答案?
當 shell 解析命令時,它
time
在辨識為控制操作符之前是否辨識為保留字|
?time
辨識為保留字和辨識為控制運算符之間的順序|
是否確定time
適用於command1
或command1 | command2
?謝謝。
time command1 | command2
time
適用於command1
或?command1 | command2
time
通常以兩種方式實現:作為外部命令和作為給定 shell 的內部功能(我說“功能”是因為它取決於 shell 如何實現它,儘管我只將其視為保留字)。因此,假設系統上至少有一個 externaltime
,實際的答案取決於使用者正在執行哪個 shell,如果適用,如何time
在這樣的 shell 中實現。根據標籤,你使用 Bash 作為你的 shell,它有一個 internal ,為了簡單起見
time
,我假設 GNU作為外部的。time
重擊
time
:
- 是保留字。
- 它適用於整個管道。
- 它可以與內部命令/功能/保留字一起使用。
GNU
time
:
- 是外部命令。
- 它適用於簡單的命令。
- 它不能與內部命令/函式/保留字一起使用,除非這些是在 shell 中呼叫的。
在您的特定場景中,當您執行 Bash 時,
time
適用於command1 | command2
. 如果您使用的 shell 沒有內部time
但係統上存在外部time
,它將適用於command1
.**問:**如果你的答案是兩者之一,你會如何指定另一個?
time
在command1
Bash 中應用:
- 用於
{ … }
限制time
範圍:{ time command1; } | command2
- 執行外部
time
命令:# Using the `command` builtin command time command1 | command2 # Using `env` env time command1 | command2 # Escaping/quoting the `time` word \time command1 | command2 'time' command1 | command2 # Explicitly running the external `time` command /usr/bin/time command1 | command2
time
使用command1 | command2
GNU申請time
:
- 將管道放在外部文件中並執行它:
time ./script.sh
- 呼叫 shell 並在其中執行管道:
time sh -c 'command1 | command2'
**問:**您能否根據 bash 的語法或 shell 如何解釋命令來解釋您的答案?
Bash在其手冊
time
的3.2.2 Pipelines章節中記錄了它:管道的格式是
[time [-p]] [!] command1 [ | or |& command2 ] …
保留字
time
會導致在管道完成後列印時序統計資訊。GNU
time
文件可通過info time
和獲得man time
:命令的格式
time
是:time [option...] COMMAND [ARG...]
time``COMMAND
使用任何給定的參數執行程序ARG...
。完成COMMAND
後,time
顯示有關 . 使用的資源的資訊COMMAND
。POSIX 記錄了標準
time
,它是許多time
實現的基礎:概要
time [-p] utility [argument...]
描述
該
time
實用程序應utility
使用作為操作數提供的參數呼叫由操作數命名的實用程序,argument
並將一條消息寫入標準錯誤,列出該實用程序的計時統計資訊。當
time
用作管道的一部分時,報告的時間是未指定的,除非它是該管道中分組命令中的唯一命令(請參閱分組命令)。基本原理
在 KornShell 中,
time
是一個 shell 保留字,可用於對整個管道進行計時,而不僅僅是一個簡單的命令。POSIX 定義的措辭允許這種實現。使用該術語
utility
而不是command
來強調這樣一個事實,即不能直接使用 shell 複合命令、管道、特殊內置函式等。但是,utility
包括使用者應用程序和 shell 腳本,而不僅僅是標準實用程序。問: shell 解析命令時,
time
在辨識為控制操作符之前是否先辨識為保留字|
?雖然 Bash 的手冊沒有明確提及此資訊,但POSIX 明確說明了辨識順序:
2.10.1 Shell 語法詞彙約定
必須首先在字元級別辨識 shell 的輸入語言。生成的標記應根據以下規則(按順序應用)按其直接上下文進行分類。這些規則將用於確定在令牌級別需要解析的“令牌”是什麼。應適用令牌辨識中的令牌辨識規則。
- 如果令牌是運算符,則應生成該運算符的令牌標識符。
- 如果字元串僅由數字組成且分隔符為
<
或之一,則應返回>
令牌標識符IO_NUMBER 。- 否則,生成令牌標識符TOKEN。
TOKEN的進一步區別取決於上下文。取決於上下文,相同的TOKEN可能會產生WORD、NAME、ASSIGNMENT_WORD或以下保留字之一。
簡而言之:運算符在保留字之前被辨識。
問:
time
辨識為保留字和辨識|
為控制運算符之間的順序是否決定time
適用於command1
或command1 | command2
?並非如此,即使
time
保留為保留字,也可以對其進行程式以應用於簡單的命令而不是整個管道(儘管我不知道有任何外殼可以做到這一點)。重要的是如何time
實施,而不是它的辨識順序。