Bash转义/扩展顺序

Bash转义/扩展顺序,bash,Bash,我是Bash的新手,在理解输入时,我很难确定输入发生了什么。具体来说,当相对于其他扩展步骤发生转义时 据我所知,bash(按顺序)执行以下操作: 支架扩张 瓷砖膨胀 参数与变量展开 命令替换 算术展开 分词 文件名扩展 但该列表不包括将所有转义序列(如\ \'转换为其含义(如\')的时间。也就是说,如果我想打印反斜杠字符。要运行的命令是 echo \\ 不是 因此,反斜杠字符语义所需的语法是两个反斜杠。必须在内部将其转换为单斜杠表示形式 这似乎是在命令替换之前的某个时候,我通过一个小测试程

我是Bash的新手,在理解输入时,我很难确定输入发生了什么。具体来说,当相对于其他扩展步骤发生转义时

据我所知,bash(按顺序)执行以下操作:

  • 支架扩张
  • 瓷砖膨胀
  • 参数与变量展开
  • 命令替换
  • 算术展开
  • 分词
  • 文件名扩展

但该列表不包括将所有转义序列(如\ \'转换为其含义(如\')的时间。也就是说,如果我想打印反斜杠字符。要运行的命令是

echo \\
不是

因此,反斜杠字符语义所需的语法是两个反斜杠。必须在内部将其转换为单斜杠表示形式

这似乎是在命令替换之前的某个时候,我通过一个小测试程序发现了这一点

所以,我的问题是:这一步什么时候开始?(或者一个完整的bash解释循环列表就完美了)


还有,口译员还有什么其他微妙之处可能会让我明白吗?(我想与了解完整列表有关)

来自手册页的扩展部分,就在重定向部分之前

删除报价

在前面的展开式之后,字符\、'、和“的所有不带引号的出现都不是由上述展开式之一产生的 被移除


删除引号是您列出的七个扩展之后的最后一个过程。

“当它将所有转义序列(例如\'转换为其含义(例如\')时。”。“-我不知道你在说什么。你能举个例子吗?好问题。如果仔细阅读,您会发现字符可以带引号或不带引号,并且只有不带引号的元字符(有时是整个标记)可以引入各种扩展。例如,“格式正确的大括号展开必须包含无引号的开始大括号和结束大括号,以及至少一个无引号的逗号或有效的序列表达式。”因此,转义首先确定每个字符的状态(有时是标记,甚至是构造),然后展开。@KarolyHorvath-讽刺的是,标记引擎将我的双反斜杠(在第一组双引号内)转换为单反斜杠。。。我现在将尝试编辑它以保留两者,谢谢您指出这一点。@4ae1e1-谢谢。所以我猜bash将转义处理为初始标记化的一部分?你知道有没有“架构指南”或类似的指南来准确了解正在发生的事情吗?@TomRees只需阅读源代码……谢谢。我不知道这个报价被删除了。因此,转义似乎用于区分各种扩展所识别的语法(例如${var})和那些相同的字符“逐字”——例如\$\{var\},这些字符现在不会被参数扩展“看到”。转义字符可防止shell应用任何特殊行为。注意,
\${var}
就足够了,因为没有参数扩展,
{
}
不再具有特殊意义。此外,引号只是转义多个字符的语法快捷方式。例如,shell不区分
\$\$
'$$'
。它们都表示完全相同的字符串。
echo \