在我的问题的第一部分,我将提供一些背景信息作为 为社区服务。第二部分包含实际问题。
第一部分
假设我创建了以下别名:
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):
一致“确定的结果词 成为命令的名字 应检查简单的命令 确定它是否是未引用的, 有效的别名。“
“每个简单的第一个字 如果未加引号,则检查命令 看看它是否有别名。“
第二部分
以下是问题:为什么是案例6(通过说\ls
来覆盖别名)
考虑引用这个词?为了与这个问题的风格保持一致,我正在寻找对“官方”文档的引用。
文档说反斜杠只会逃避以下内容 字符,而不是引用a的单引号和双引号 字符序列。 POSIX standard (2.2.1):
“未引用的反斜杠应为 保留文字的价值 跟随角色,用 例外<换行符>“
Bash Reference Manual (3.1.2.1):
“没有引用的反斜杠'\'是 Bash逃脱角色。它保留 下一个的字面值 随之而来的角色 换行例外。“
(顺便说一句,是不是“接下来的一个字符”有点矫枉过正?)
可能的答案可能是这种情况并不那么特别:它是
类似于ANSI-C引用中的少数情况,例如\nnn
。但是,这仍然是
转义单个字符(八位字符,其值为八进制
值nnn),而不是一系列字符。
答案 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