为什么反斜杠会阻止别名扩展?

时间:2011-05-28 16:30:57

标签: bash shell escaping posix alias

在我的问题的第一部分,我将提供一些背景信息作为 为社区服务。第二部分包含实际问题。

第一部分

假设我创建了以下别名:

alias ls='ls -r'

我知道如何在下面暂时unalias(即覆盖此别名) 方式,使用:

1)命令的完整路径名:/bin/ls

2)命令替换:$(which ls)

3)内置命令:command ls

4)双引号:"ls"

5)单引号:'ls'

6)反斜杠字符:\ls

案例1是显而易见的,案例2只是一种变化。案例3中内置的命令旨在忽略shell函数,但显然它也可用于规避别名。最后,案例4和案例5与POSIX standard (2.3.1)

一致
  

“确定的结果词   成为命令的名字   应检查简单的命令   确定它是否是未引用的,   有效的别名。“

Bash Reference Manual (6.6)

  

“每个简单的第一个字   如果未加引号,则检查命令   看看它是否有别名。“

第二部分

以下是问题:为什么是案例6(通过说\ls来覆盖别名) 考虑引用这个词?为了与这个问题的风格保持一致,我正在寻找对“官方”文档的引用。

文档说反斜杠只会逃避以下内容 字符,而不是引用a的单引号和双引号 字符序列。 POSIX standard (2.2.1)

  

“未引用的反斜杠应为   保留文字的价值   跟随角色,用   例外<换行符>“

Bash Reference Manual (3.1.2.1)

  

“没有引用的反斜杠'\'是   Bash逃脱角色。它保留   下一个的字面值   随之而来的角色   换行例外。“

(顺便说一句,是不是“接下来的一个字符”有点矫枉过正?)

可能的答案可能是这种情况并不那么特别:它是 类似于ANSI-C引用中的少数情况,例如\nnn。但是,这仍然是 转义单个字符(八位字符,其值为八进制 值nnn),而不是一系列字符。

3 个答案:

答案 0 :(得分:5)

历史上,由POSIX维护,引用单词的任何部分会导致整个单词被引用以用于函数和别名扩展。它也适用于引用此文档的结束标记:

cat << \EOF
this $text is fully quoted
EOF

答案 1 :(得分:5)

只是为了完成,这是另一种抑制别名的方法。函数查找(通过清除整个shell环境以获取单个命令):

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html
env -i ls

答案 2 :(得分:0)

\ ls仅引用第一个字符而不是整个字。这相当于写'我'。

您可以这样验证:

$ touch \?l
$ \??
bash: ?l: command not found

如果\ ??引用它会说的整个字?找不到而不是找不到。

即。它具有与以下相同的效果:

$ '?'?
bash: ?l: command not found

而不是:

$ '??'
bash: ??: command not found