我有一个别名rm='/bin/rm -i'
,我知道如果我"rm" filename
在命令行中输入,别名将被忽略,并且将调用不带 -i 标志的正常 rm 命令,但我不明白为什么会这样。
我根本不明白为什么"rm"
起作用,考虑到......
将字符括在双引号 ('"') 中会保留引号内所有字符的字面值,但 '$'、'`'、'\' 和启用历史扩展时的 '!' 除外。- [gnu.org][1]
...但它确实以某种方式起作用。它忽略了我的别名。这是如何运作的?
此外,我有时会在我的组织的 Korn shell 脚本中看到这些忽略别名的命令调用。但这是不必要的,对吧?因为 Korn shell 脚本无论如何都无法访问 shell 级别名吗?
[1]:https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#:~:text=Enleading%20characters%20in%20double%20quotes,POSIX%20Mode)%2C%20%20%27%20!
答案1
这是一个非常具体的案例:参见
https://www.gnu.org/software/bash/manual/bash.html#Aliases
每个简单命令的第一个词,如果不加引号,检查它是否有别名。如果是这样,该单词将被别名的文本替换。
手册的该部分指出了别名的几个令人困惑的方面,并以以下内容结尾:
对于几乎所有用途,shell 函数都优于别名。