在我的脚本副本中conda.sh
,我看到以下几行:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
d
我很好奇为什么in前面有一个反斜杠dirname
。我不认为这是必要的。这种反斜杠的使用也出现在源文件的其他地方。我是否有这样做的理由?
反斜杠将抑制别名扩展,即它执行原始命令并确保别名版本不运行。当系统已设置
shopt -s expand_aliases
(仅限 BASH)或使用source
.一些系统管理员喜欢在所有内容中添加反斜杠,以防止别名的副作用,以防它在其他地方无意中别名,并且别名如前所述被扩展。例如,如果系统在
alias dirname='dirname -z'
某处设置了此项,并且条件允许扩展别名,那么不幸的是,尝试调用 dirname 的脚本将改为调用dirname -z
,这不是脚本的本意。如果确定不存在这样的别名,我们可以删除所有反斜杠,它应该可以正常工作。
或者,可以使用
command
而不是反斜杠版本来抑制别名。\dirname
因此,可以使用代替command dirname
,这可能看起来更具可读性。(对于像这样的内置命令cd
,应该builtin
改用)。我更喜欢这个,因为它也绕过具有相同名称的函数以及任何别名。如果
conda.sh
是要获取的文件,则反斜杠用于绕过别名。Bash 通常会为脚本执行禁用别名扩展,但对于可能在交互式 shell 中运行的源文件,情况并非如此。所以只是dirname
可以运行一个名为 的别名dirname
,但\dirname
会跳过别名扩展并运行一个名为 的函数或命令dirname
。(不仅仅是反斜杠,任何引用都可以。)