为什么此 shell 脚本中包含反斜杠?

ext*_*xe5 23 bash shell-script

在我的conda.sh脚本副本中,我看到以下几行:

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi
Run Code Online (Sandbox Code Playgroud)

我很好奇,为什么在前面的一个反斜杠ddirname。我认为没有必要。这种反斜杠的使用也出现在源文件的其他地方。有没有理由这样做我失踪了?

ott*_*pro 32

反斜杠将抑制别名扩展,即它执行原始命令并确保不运行别名版本。当系统已设置shopt -s expand_aliases(仅限 BASH)或使用source.

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion
Run Code Online (Sandbox Code Playgroud)

一些系统管理员喜欢在所有内容中添加反斜杠,作为防止别名副作用的预防措施,以防万一它在其他地方无意中被别名并且别名被扩展,如前所述。例如,如果系统在alias dirname='dirname -z'某处设置了它并且条件允许扩展别名,那么尝试调用 dirname 的脚本将不幸地dirname -z改为调用,这不是脚本所期望的。

如果确定这样的别名不存在,我们可以删除所有反斜杠,它应该可以正常工作。

或者,可以使用command代替反斜杠版本来取消别名。因此,\dirname可以使用代替command dirname,这可能看起来更具可读性。(对于像 那样的内置命令cd,应该builtin改用)。我更喜欢这个,因为它也绕过了同名的函数以及任何别名。

  • @Centimane 是的,但请确保执行 `\unalias -a` 以抑制别名扩展 (21认同)
  • 另外值得注意的是`unalias -a`,它删除所有别名。 (2认同)

mur*_*uru 20

如果conda.sh是一个文件,则反斜杠用于绕过别名。Bash 通常禁用脚本执行的别名扩展,但对于可能在交互式 shell 中运行的源文件,情况并非如此。因此,dirname可能会运行名为 的别名dirname,但\dirname会跳过别名扩展并运行名为 的函数或命令dirname。(不过,不仅仅是反斜杠,任何引用都可以。)

  • (`\command dirname`,以防万一有人也为`command` 做了一个别名。):| (7认同)
  • 或`命令目录名`。 (5认同)