我们如何才能使“时间”应用于管道或其组件?

我们如何才能使“时间”应用于管道或其组件?
time command1 | command2

是否time适用于command1command1 | command2?如果您的答案是两者之一,您将如何指定另一个?

您能根据 bash 语法或 shell 如何解释命令来解释您的答案吗?

当 shell 解析命令时,它是否在识别为控制操作符time之前识别为保留字?识别为保留字和识别为控制运算符|之间的顺序是否决定是否适用于或?time|timecommand1command1 | command2

谢谢。

答案1

time command1 | command2

是否time适用于command1command1 | command2?

time通常以两种方式实现:作为外部命令和作为给定 shell 的内部功能(我说“功能”是因为它取决于 shell 如何实现它,尽管我只将其视为保留字)。所以,假设time系统上至少有一个外部设备,实际答案取决于用户正在运行哪个 shell,以及(如果适用)如何time在此类 shell 中实现

根据标签,您使用 Bash 作为 shell,它有一个内部的,为了简单起见,time我假设 GNU作为外部的。time

重击time

  • 是保留字。
  • 它适用于整个管道。
  • 它可以与内部命令/函数/保留字一起使用。

GNU time

  • 是外部命令。
  • 它适用于简单的命令。
  • 它不能与内部命令/函数/保留字一起使用,除非它们是在 shell 中调用的。

在您的特定场景中,当您运行 Bash 时,time适用于command1 | command2。如果您使用的 shell 没有内部但系统上存在time外部,则它将适用于.timecommand1


问:如果您的答案是两者之一,您将如何指定另一个?

适用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
    

适用timecommand1 | command2GNU time

  • 将管道放置在外部文件中并运行它:

    time ./script.sh
    
  • 调用 shell 并在其中运行管道:

    time sh -c 'command1 | command2'
    

问:您能根据 bash 语法或 shell 如何解释命令来解释您的答案吗?

Bash 将其记录time3.2.2 管道其手册章节:

管道的格式是

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

保留字time会在管道完成后打印计时统计信息。

GNUtime文档可通过info time和获取man time

命令的格式time为:

time [option...] COMMAND [ARG...]

timeCOMMAND使用任何给定的参数运行程序ARG...。完成后COMMANDtime显示有关 所使用的资源的信息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. 否则,令牌标识符代币结果。

进一步区分代币是依赖于上下文的。可能是一样的代币产量单词, A姓名, 一个ASSIGNMENT_WORD,或下面的保留字之一,取决于上下文。

简而言之:运算符在保留字之前被识别


问:time识别为保留字和识别|为控制运算符之间的顺序是否决定是否time适用于command1command1 | command2

事实并非如此,即使time保留为保留字,它也可以被编程为应用于简单命令而不是整个管道(尽管我不知道有任何 shell 做到了这一点)。重要的是如何time实现,而不是其识别顺序

相关内容