为什么用反斜杠启动shell命令?


Answers:


200
alias curl='curl --some --default --options'

如果您有别名,curl并且不想使用它,则在前面加上反斜杠将禁用别名并直接运行curl二进制文件。

请注意,这仅适用于交互式外壳。别名在脚本中不会生效,因此在此没有必要。


4
别名可以在脚本中使用,使用shopt -s expand_aliases前请先使用别名
Alex

@lbaby在Kornshell中也是如此。你去混叠放一个反斜杠在它前面的一个可能的命令别名。当人们定义带有目录名称的命令提示符时,这在Kornshell中很常见。注意,此函数的第一行是`\ cd“ $ @”`。
David W.

1
值得注意的是,\curl它不会绕过任何名为的shell 函数curl。为此,您可以使用bash内置命令commandcommand curl ...
Keith Thompson

7
一种更容易理解的书写方式\curl ...command curl ...
glenn jackman

需要注意的是dash(可能还有其他炮弹,虽然你是正确bashexpand_aliases扩大别名脚本。
AdrianGünter'18

163

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

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

使用\curl只是最常见和易读的方式。由于这是一项标准化功能,因此可以期望它可以在所有Bourne遗产外壳中使用。

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


14
+1,用于给出\curl绕过同名别名的具体原因;注意,只有别名被绕过了,壳函数没有被绕过。command curl ...将确保绕过任何一个
mklement0

1
我看不到最后一句话的意思。顺便说一句,您只提到绕过别名,但是任何形式的引用也将绕过关键字。
gniourf_gniourf

@ mklement0不太保证... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"打印Not command, lol!×3倍
阿德里安·冈特

3
@AdrianGünter:是的,如果您将command 自己替换为shell函数,那么您将无法使用该机制。如示例所述,您的示例显示的是\ 不绕过函数。一个不败的例子:date() { echo 'not date'; }; date; command date。如果你担心恶意篡改command,看到stackoverflow.com/a/35931876/45375
mklement0

@ mklement0我理解了所有这些,但是我的意思是,如果不能保证没有任何其他命令名称作为函数存在(即,您缺乏对执行环境的控制),那么也就不能依靠command不被覆盖。通过您自己的链接:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
AdrianGünter18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.