关键字、保留字和内置字之间的区别?

Tim*_*Tim 11 bash

Make bash use external `time` 命令而不是 shell built-in,Stéphane Chazelas 写道:

没有time内置 bash。time是一个关键字,所以你可以做例如time { foo; bar; }

我们可以验证一下:

$ type -a time
time is a shell keyword
time is /usr/bin/time
Run Code Online (Sandbox Code Playgroud)

它没有显示time可以是内置命令。

  1. “关键字”的定义是什么?
  2. “关键字”与“Bash 参考手册”中的“保留字”是同一个概念吗?

    保留字

    一个对壳有特殊意义的词。大多数保留字都引入了 shell 流控制结构,例如forwhile

  3. 关键字是否一定不是命令(或不是内置命令)?

    作为关键字,是time不是命令(或不是内置命令)?

    根据关键字和内建的定义,为什么time 不是内建而是关键字?

  4. 为什么“你可以做例如time { foo; bar; }”因为“time是一个关键字”?

小智 12

关键字、保留字和内置命令都是简单命令的“第一个字”。它们可以分为两组:关键字和内置函数。两者是相互排斥的。一个词(标记)可以是关键字或内置,但不能同时是两者。

为什么是“第一个词”

“简单命令”POSIX 定义(强调我的):

“简单命令”是一系列可选的变量赋值和重定向,以任何顺序,可选地跟随单词和重定向,由控制运算符终止。

2.- 不是变量赋值或重定向的词应该被扩展。如果任何字段在扩展后仍然存在,则第一个字段应被视为命令名称,其余字段是命令的参数。

在确定“第一个单词”之后,并在扩展之后(例如通过别名)最后一个单词是“命令”,每行只能有一个命令。该命令词可以是内置命令或关键字。

关键词

是的,关键字是“保留字”。装载“人庆典”,并搜索关键字或只是执行此命令:LESS=+/'keyword' man bash

搜索的第一个命中是这样说的:

关键字 Shell 保留字。

它发生在完成部分,但很清楚。

保留字

在 POSIX 中,有“保留字”的定义以及保留字的作用的一些描述

但是 Bash 手册有一个更好的工作定义。搜索“保留字”( LESS=+/'RESERVED WORDS' man bash) 并找到以下内容:

保留字 保留字是对 shell 有特殊意义的字。以下单词在未加引号时被识别为保留,并且是简单命令的第一个单词或 case 或 for 命令的第三个单词:

! case do done elif else esac fi for function if in select then until while { } time [[ ]]
Run Code Online (Sandbox Code Playgroud)

内置

Bash 手册中没有定义它,但它非常简单:

它是在 shell 内部实现的命令,用于满足 shell 的基本需求(cd、pwd、eval)或一般速度或在某些情况下避免对外部实用程序的冲突解释。

时间是关键词

为什么 time 不是内置函数而是关键字?

允许存在一个命令作为第二个字。

它类似于如何if ... then .... fi允许在第一个关键字之后包含命令(甚至复合命令)if。或whilecase等。


归档时间:

查看次数:

4584 次

最近记录:

4 年,1 月 前