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

lba*_*aby 195 bash shell

\curl -L https://get.rvm.io | bash -s stable
Run Code Online (Sandbox Code Playgroud)

为什么命令以\?开头? 这是我看到它的网站.

Joh*_*ica 190

alias curl='curl --some --default --options'
Run Code Online (Sandbox Code Playgroud)

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

请注意,这仅适用于交互式shell.别名在脚本中不起作用,因此在那里没有必要.

  • 编写`\ curl ...`更容易理解的方法是`command curl ...` (7认同)
  • 在使用别名之前,可以使用`shopt -s expand_aliases`在脚本中使用别名 (4认同)
  • 值得注意的是,“\curl”不会绕过任何名为“curl”的 shell *函数*。为此,您可以使用 bash 内置命令“command”:“command curl ...” (3认同)

Jen*_*ens 153

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

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"
Run Code Online (Sandbox Code Playgroud)

使用\curl只是最常见和可读的方式.由于这是一个标准化的功能,您可以期望它适用于所有Bourne-heritage shell.

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

  • +1给出了为什么`\ curl`绕过了同名别名的具体原因; 请注意,只有_aliases_以这种方式被绕过,而不是_shell functions_; `command curl ...`将确保绕过_either_. (13认同)
  • @AdrianGünter:是的,如果用shell函数替换`command` _itself_,那么你就是在破坏机制.您的示例显示的是`\`不会绕过_functions_,如上所述.一个非自我毁灭的例子:`date(){echo'not date'; }; 日期; 命令日期`.如果您担心带有`command`的恶意_tampering_,请参阅/sf/answers/2515231351/ (3认同)
  • @mklement0我明白这一切,但我的观点是,如果不能保证任何其他命令名称不作为函数存在(即,您缺乏对执行环境的控制),那么也不能依赖`command` 不被覆盖。来自您自己的链接:“因此,在无法控制执行环境的情况下,您无法编写完全不受篡改的 shell 脚本,除非您知道您的代码将由 dash、ksh 或 bash 执行(使用适当的解决方法) )` (2认同)