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

Ale*_*lis 23 bash shell alias posix escaping

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

第一部分

假设我创建了以下别名:

alias ls='ls -r'
Run Code Online (Sandbox Code Playgroud)

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

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

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

3)内置命令: command ls

4)双引号: "ls"

5)单引号: 'ls'

6)反斜杠字符: \ls

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

"应检查一个被识别为简单命令的命令名字的结果字,以确定它是否是一个不带引号的有效别名."

Bash参考手册(6.6):

"检查每个简单命令的第一个单词,如果没有引用,则检查它是否有别名."

第二部分

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

文档说反斜杠只转义后续字符,而不是单引号和双引号引用一系列字符. POSIX标准(2.2.1):

"未引用的反斜杠应保留以下字符的字面值,但<newline>除外"

Bash参考手册(3.1.2.1):

"一个非引用的反斜杠'\'是Bash转义字符.它保留了下一个字符的字面值,除了换行符."

(顺便说一句,是不是"下一个角色"有点矫枉过正?)

一个可能的答案可能是这种情况并不那么特别:它类似于ANSI-C引用中的一些情况,例如\nnn.然而,这仍然是逸出的单个字符(八位字符,其值是八进制值NNN),而不是一个字符序列.

gee*_*aur 5

在历史上,并通过保持POSIX,引用字的任何部分导致被认为是整个字所报的功能和别名扩展的目的.它也适用于引用此文档的结束标记:

cat << \EOF
this $text is fully quoted
EOF
Run Code Online (Sandbox Code Playgroud)

  • 一个随机的注释:显然(至少在我试过的shell中),在单词的某处有一对空引号,算作引用单词的一部分(例如:'''ls`,`l "s`和'cat << EOF''`). (2认同)

小智 5

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

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html
env -i ls
Run Code Online (Sandbox Code Playgroud)