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)
我很好奇,为什么在前面的一个反斜杠d
中dirname
。我认为没有必要。这种反斜杠的使用也出现在源文件的其他地方。有没有理由这样做我失踪了?
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
改用)。我更喜欢这个,因为它也绕过了同名的函数以及任何别名。
mur*_*uru 20
如果conda.sh
是一个文件,则反斜杠用于绕过别名。Bash 通常禁用脚本执行的别名扩展,但对于可能在交互式 shell 中运行的源文件,情况并非如此。因此,dirname
可能会运行名为 的别名dirname
,但\dirname
会跳过别名扩展并运行名为 的函数或命令dirname
。(不过,不仅仅是反斜杠,任何引用都可以。)