为什么要在shell命令前加反斜杠?

229
2个回答

220
alias curl='curl --some --default --options'
如果您为curl设置了别名并且不想使用它,可以在前面加入反斜杠来禁用别名并直接运行curl二进制文件。
请注意,这仅适用于交互式shell。在脚本中,别名不生效,因此在那里使用它是不必要的。

5
在使用别名之前,可以通过使用命令shopt -s expand_aliases在脚本中启用别名。 - Alex
@lbaby 在Kornshell中也是一样的。通过在命令别名前面加上反斜杠来_dealias_可能的命令别名。当人们定义带有目录名称的命令提示符时,这在Kornshell中非常常见。请注意此函数的第一行为 \cd "$@" - David W.
3
值得注意的是,\curl 不会绕过任何名为 curl 的 shell function。为此,您可以使用 bash 内置命令 commandcommand curl ... - Keith Thompson
8
\curl ...写为command curl...更易理解。 - glenn jackman
请注意,dash (以及其他一些 shell,虽然对于没有 expand_aliasesbash 命令是正确的) 确实 在脚本中扩展别名。 - Adrian Günter
我在shell脚本中看到了反斜杠命令,这些命令是用来被引用的。 - Kevin Olree

184

(Bourne/POSIX)shell规范指出,在交互式shell中,当命令单词的任何字符被引用时,会禁止别名替换(alias substitution)。反斜杠是其中一种方法,但也有其他众所周知的引用方式:单引号和双引号。以下所有内容都将禁止别名替换:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

使用\curl是最常见和易读的方式。由于这是一个标准化功能,您可以期望它在所有Bourne衍生shell中正常工作。

\curl看起来有点像TeX命令,不是吗? :-)


25
+1 是因为 \curl 可以绕过与其同名的别名,需要注意只有 别名 会被绕过,而不是 _shell 函数_,使用 command curl ... 可以确保绕过 _二者_。 - mklement0
1
@mklement0 不太确定... command() { echo "不是命令,哈哈!"; } ; command -V echo ; \command -V echo ; \command command echo "这是命令!(掩盖绝望)" 会打印出 Not command, lol! 三次。 - Adrian Günter
4
@AdrianGünter:是的,如果你用一个shell函数替换command本身,你就破坏了这个机制。你的例子表明\ 不能绕过_shell函数_,正如所述。一个非自我破坏的例子:date() { echo 'not date'; }; date; command date。如果你担心恶意篡改command,请参见https://dev59.com/nJTfa4cB1Zd3GeqPXu_T#35931876。 - mklement0
2
@mklement0 我理解您说的,但我的观点是,如果一个人无法保证任何其他命令名称不存在作为函数(即,缺乏对执行环境的控制),那么也不能依赖command不被覆盖。从您自己的链接中得出:因此,在没有对执行环境进行控制的情况下,除非您知道您的代码将由dash、ksh或bash(使用解决方法)执行,否则您无法编写完全免疫篡改的shell脚本 - Adrian Günter
1
\curl 工作得非常好。我一直在使用 /usr/bin/curl 来绕过别名。感谢您为我节省了 8 次按键! - exbctel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接