time command1 | command2
是否time
适用于command1
或command1 | command2
?如果您的答案是两者之一,您将如何指定另一个?
您能根据 bash 语法或 shell 如何解释命令来解释您的答案吗?
当 shell 解析命令时,它是否在识别为控制操作符time
之前识别为保留字?识别为保留字和识别为控制运算符|
之间的顺序是否决定是否适用于或?time
|
time
command1
command1 | command2
谢谢。
答案1
time command1 | command2
是否
time
适用于command1
或command1 | command2
?
time
通常以两种方式实现:作为外部命令和作为给定 shell 的内部功能(我说“功能”是因为它取决于 shell 如何实现它,尽管我只将其视为保留字)。所以,假设time
系统上至少有一个外部设备,实际答案取决于用户正在运行哪个 shell,以及(如果适用)如何time
在此类 shell 中实现。
根据标签,您使用 Bash 作为 shell,它有一个内部的,为了简单起见,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 管道其手册章节:
管道的格式是
[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 的输入语言必须首先在字符级别被识别。生成的标记应根据以下规则(按顺序应用)按其直接上下文进行分类。这些规则应用于确定要在令牌级别进行解析的“令牌”是什么。令牌识别规则令牌识别适用。
- 如果令牌是操作员,则应生成该操作员的令牌标识符。
- 如果字符串仅由数字组成并且分隔符是
<
或之一>
,则令牌标识符IO_NUMBER应被退回。- 否则,令牌标识符代币结果。
进一步区分代币是依赖于上下文的。可能是一样的代币产量单词, A姓名, 一个ASSIGNMENT_WORD,或下面的保留字之一,取决于上下文。
简而言之:运算符在保留字之前被识别。
问:
time
识别为保留字和识别|
为控制运算符之间的顺序是否决定是否time
适用于command1
或command1 | command2
?
事实并非如此,即使time
保留为保留字,它也可以被编程为应用于简单命令而不是整个管道(尽管我不知道有任何 shell 做到了这一点)。重要的是如何time
实现,而不是其识别顺序。