【发布时间】:2011-09-04 00:13:33
【问题描述】:
在我的问题的第一部分,我将提供一些背景信息作为 为社区服务。第二部分包含实际问题。
第一部分
假设我创建了以下别名:
alias ls='ls -r'
我知道如何在下面临时取消别名(即覆盖此别名) 方式,使用:
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):
"一个被识别的结果词 成为 a 的命令名单词 简单的命令将被检查到 确定它是否是未引用的, 有效的别名。”
还有Bash Reference Manual (6.6):
"每个简单的第一个单词 命令,如果未引用,则检查为 看看有没有别名。”
第二部分
问题来了:为什么是案例 6(通过说 \ls 覆盖别名)
考虑引用这个词?按照这个问题的风格,我正在寻找对“官方”文档的参考。
文档说反斜杠只能转义以下内容 字符,而不是单引号和双引号,它引用一个 字符序列。 POSIX standard (2.2.1):
"未引用的反斜杠应 保留字面值 跟随字符,与 "
的例外
Bash Reference Manual (3.1.2.1):
"不带引号的反斜杠‘\’是 Bash 转义字符。它保存 下一个的字面值 随后的字符,与 换行符除外。”
(顺便说一句,“下一个角色”是不是有点矫枉过正?)
一个可能的答案可能是这种情况并不特别:它是
类似于 ANSI-C 引用中的一些情况,例如\nnn。然而,这仍然是
转义单个字符(值为八进制的八位字符
值 nnn),而不是字符序列。
【问题讨论】:
-
请注意:第 6 个与前 5 个不同:前 5 个绕过函数和别名,而
\ls将(在 bash 中)仅绕过别名,而不是同名函数.即:alias ls='echo "aliased"' ; function ls { echo "function" ; } ; ls ; \ls ; command ls:第一个(ls)将显示“aliased”,第二个(\ls)仅绕过别名,因此显示“function”,第三个(命令 ls)显示常规 ls 的输出 -
这是一个很好的问题,但似乎没有任何解释能解决我对此事的任何困惑。 @alexandros-gezerlis,如果你能理解原因,你能帮我(家里的人)拼出来吗?
-
@OlivierDulac 5 至少在 GNU bash 4.3.11 中没有绕过功能
标签: bash shell escaping posix alias