Bash

我們如何才能讓“時間”應用於管道或其組件?

  • November 7, 2018
time command1 | command2

time適用於command1或?command1 | command2如果您的答案是兩者之一,您將如何指定另一個?

您能否根據 bash 的語法或 shell 如何解釋命令來解釋您的答案?

當 shell 解析命令時,它time在辨識為控制操作符之前是否辨識為保留字|time辨識為保留字和辨識為控制運算符之間的順序|是否確定time適用於command1command1 | command2

謝謝。

time command1 | command2

time適用於command1或?command1 | command2

time通常以兩種方式實現:作為外部命令和作為給定 shell 的內部功能(我說“功能”是因為它取決於 shell 如何實現它,儘管我只將其視為保留字)。因此,假設系統上至少有一個 external time實際的答案取決於使用者正在執行哪個 shell,如果適用,如何time在這樣的 shell 中實現

根據標籤,你使用 Bash 作為你的 shell,它有一個 internal ,為了簡單起見time,我假設 GNU作為外部的。time

重擊time

  • 是保留字。
  • 它適用於整個管道。
  • 它可以與內部命令/功能/保留字一起使用。

GNU time

  • 是外部命令。
  • 它適用於簡單的命令。
  • 它不能與內部命令/函式/保留字一起使用,除非這些是在 shell 中呼叫的。

在您的特定場景中,當您執行 Bash 時,time適用於command1 | command2. 如果您使用的 shell 沒有內部time但係統上存在外部time,它將適用於command1.


**問:**如果你的答案是兩者之一,你會如何指定另一個?

timecommand1Bash 中應用:

  • 用於{ … }限制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 | command2GNU申請time

  • 將管道放在外部文件中並執行它:
time ./script.sh
  • 呼叫 shell 並在其中執行管道:
time sh -c 'command1 | command2'

**問:**您能否根據 bash 的語法或 shell 如何解釋命令來解釋您的答案?

Bash在其手冊time3.2.2 Pipelines章節中記錄了它:

管道的格式是

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

保留字time會導致在管道完成後列印時序統計資訊。

GNUtime文件可通過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 的輸入語言。生成的標記應根據以下規則(按順序應用)按其直接上下文進行分類。這些規則將用於確定在令牌級別需要解析的“令牌”是什麼。應適用令牌辨識中的令牌辨識規則。

  1. 如果令牌是運算符,則應生成該運算符的令牌標識符。
  2. 如果字元串僅由數字組成且分隔符為<或之一,則應返回>令牌標識符IO_NUMBER 。
  3. 否則,生成令牌標識符TOKEN

TOKEN的進一步區別取決於上下文。取決於上下文,相同的TOKEN可能會產生WORDNAMEASSIGNMENT_WORD或以下保留字之一。

簡而言之:運算符在保留字之前被辨識


問:time辨識為保留字和辨識|為控制運算符之間的順序是否決定time適用於command1command1 | command2

並非如此,即使time保留為保留字,也可以對其進行程式以應用於簡單的命令而不是整個管道(儘管我不知道有任何外殼可以做到這一點)。重要的是如何time實施,而不是它的辨識順序

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