【问题标题】:Bash escaping/expanding orderBash 转义/扩展顺序
【发布时间】:2015-11-24 20:35:50
【问题描述】:

我对 Bash 还很陌生,我无法弄清楚我的输入在解释时发生了什么。具体来说,当转义相对于其他扩展步骤发生时。

根据我的阅读,bash 执行以下操作(按顺序):

  • 大括号扩展
  • 波浪扩展
  • 参数和变量扩展
  • 命令替换
  • 算术展开
  • 分词
  • 文件名扩展

但是这个列表不包括它转换所有转义序列时,例如'\\' 进入他们的含义,例如'\'。也就是说,如果我想打印一个反斜杠字符。要运行的命令是

echo \\

不是

echo \

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

我在一个小型测试程序中发现,似乎是在命令替换之前的某个时间。

所以,我的问题是:这一步什么时候进行? (或者完整的 bash 解释循环列表将是完美的)

此外,解释器中是否还有其他可能会引起我注意的微妙之处? (与了解我猜的完整列表有关)

【问题讨论】:

  • "当它将所有转义序列(例如'\')转换为它们的含义时,例如'\'。" - 我不确定你在说什么。能举个例子吗?
  • 好问题。如果你仔细阅读gnu.org/software/bash/manual/bash.html,你会发现字符可以被引用也可以不被引用,并且只有不被引用的元字符(有时是整个标记)可以引入各种扩展。例如,“格式正确的大括号扩展必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。”因此,转义首先出现并确定每个字符的状态(有时是令牌甚至构造),然后展开。
  • @KarolyHorvath - 具有讽刺意味的是,标记引擎将我的双反斜杠(在第一组双引号内)转换为单个反斜杠......我会尝试编辑它以保留两者,谢谢指出这一点。
  • @4ae1e1 - 谢谢。所以我猜 bash 作为初始标记化的一部分处理转义?您是否知道是否有“架构指南”或同等内容可以准确了解发生了什么?
  • @TomRees 只需阅读源代码...

标签: bash


【解决方案1】:

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

引用删除

在前面的扩展之后,所有未加引号的字符 \、' 和 " 不是由上述扩展之一产生的 被删除。

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

【讨论】:

  • 谢谢。我没有意识到这属于引号删除。 Link to man page 因此,转义似乎用于区分各种扩展识别的语法 - 例如${var} - 和那些相同的字符'逐字' - 例如\$\{var\},现在不会被参数扩展“看到”。
  • 转义字符可防止 shell 应用任何特殊行为。请注意,\${var} 就足够了,因为没有参数扩展,{} 不再具有特殊含义。此外,引号只是转义多个字符的语法快捷方式。例如,shell 不区分\$\$'$$'。它们都代表完全相同的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多