开发者问题收集

如何生成 Bash 中每个有效语法运算符的列表(包括输入和输出)?

2021-10-31
60

根据 Bash 参考手册 ,Bash 脚本语言由 4 个不同的语法元素子类组成:

  • 内置命令 ( aliascd )
  • 保留字 ( iffunction )
  • 参数和变量 ( $IFS )
  • 函数 ( abortend-of-file - 使用 Ctrl-d 等键绑定激活)

除了阅读手册之外,我还天生好奇是否存在是一种以编程方式列出或生成所有此类关键字的方法,至少是上述类别之一。我认为这在某些情况下很有用。有时我希望我能看到我可以在任意时刻编写的所有选项,并且将这些信息作为数据而不是格式化的手册,这样既方便又有针对性,并且可以编辑,以防您想删除您熟悉的命令或目前太晦涩的命令。

我的理解是,Bash 将输入放入 stdin 并将其传递给正在运行的 shell 进程。当代码以可用于生产的形式分发时,它会被编译,因此运行速度更快。与使用 Python REPL 不同,您无法从 Bash 内部访问 Bash 源代码,因此编写一个搜索源文件以查找各种已定义命令的程序并不是一条非常直接的途径。我的意思是,如果您想列出所有函数,Python 有 dir() 函数,它可以以编程方式在命名空间中查找函数名称。但我认为 Bash 做不到这一点。我认为它的源文件中没有特殊的语法,这使得查找和识别所有关键字变得容易。相反,只要你简单地输入它们,它们就会被找到 - 比如 cd 会“找到”程序 cd ,因为 $PATH 返回该命令的路径 - 但没有特殊的方法来 发现 它们。

或者我错了?从技术上讲,当你没有得到“错误:未知命令”作为响应时,你可以通过生成每个长度的符号的每种组合并记录来运行“强力”搜索。

还有其他巧妙的编程方式可以做到这一点吗?

2个回答

I mean I want to see a list of every symbol or string that the bash compiler

Bash 不是 编译器 。它和我所知道的所有其他 shell 都是各种语言的 解释器

recognises and knows what to do with, including commands like “ls” or just a symbol like “*”. I also want to see the inputs and outputs for each symbol, i.e., some commands are executed in the shell prompt by themselves, but what data type do they return?

shell 执行的所有命令都有一个 退出状态 ,它是一个介于 0 和 255 之间的数字。这与“返回类型”非常接近。它们中的许多命令在某些条件下还会向一个或两个流(标准输出流和标准错误流)产生特殊的输出,并且许多命令对 shell 环境或操作环境有其他影响。

And some require a certain data type to standard input.

我想不出一个内置实用程序,其预期输入被很好地描述为具有特定的数据类型。这实际上不是一个面向流的概念。

I want to do this just as a rigorous way to study the language.

如果您想严格研究该语言,那么您应该研究 它的手册 ,其中您描述的所有内容都已被编译。您可能还想研究 POSIX shell 命令语言手册 ,以获得稍微不同的视角,该手册在某些领域更为详尽,尽管其记录的内容在某些细节上与 Bash 的默认行为不同。

如果您想编译自己的 Bash 语法和行为摘要,那么这些就是此类努力的最佳源材料。

John Bollinger
2021-10-31

您可以使用以下技巧获取 bash 的所有保留字和语法元素的列表:

help -s '*' | cut -d: -f1

或者更准确地说:

help -s \* | awk -F ': ' 'NR>2&&!/variables/{print $1}'
Léa Gris
2021-10-31