【发布时间】:2015-11-24 20:35:50
【问题描述】:
我对 Bash 还很陌生,我无法弄清楚我的输入在解释时发生了什么。具体来说,当转义相对于其他扩展步骤发生时。
根据我的阅读,bash 执行以下操作(按顺序):
- 大括号扩展
- 波浪扩展
- 参数和变量扩展
- 命令替换
- 算术展开
- 分词
- 文件名扩展
但是这个列表不包括它转换所有转义序列时,例如'\\' 进入他们的含义,例如'\'。也就是说,如果我想打印一个反斜杠字符。要运行的命令是
echo \\
不是
echo \
因此,反斜杠字符语义所需的语法是两个反斜杠。这必须在内部转换为单斜线表示。
我在一个小型测试程序中发现,似乎是在命令替换之前的某个时间。
所以,我的问题是:这一步什么时候进行? (或者完整的 bash 解释循环列表将是完美的)
此外,解释器中是否还有其他可能会引起我注意的微妙之处? (与了解我猜的完整列表有关)
【问题讨论】:
-
"当它将所有转义序列(例如'\')转换为它们的含义时,例如'\'。" - 我不确定你在说什么。能举个例子吗?
-
好问题。如果你仔细阅读gnu.org/software/bash/manual/bash.html,你会发现字符可以被引用也可以不被引用,并且只有不被引用的元字符(有时是整个标记)可以引入各种扩展。例如,“格式正确的大括号扩展必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。”因此,转义首先出现并确定每个字符的状态(有时是令牌甚至构造),然后展开。
-
@KarolyHorvath - 具有讽刺意味的是,标记引擎将我的双反斜杠(在第一组双引号内)转换为单个反斜杠......我会尝试编辑它以保留两者,谢谢指出这一点。
-
@4ae1e1 - 谢谢。所以我猜 bash 作为初始标记化的一部分处理转义?您是否知道是否有“架构指南”或同等内容可以准确了解发生了什么?
-
@TomRees 只需阅读源代码...
标签: bash