我不明白 shell 如何处理 PATH 和 $PATH 。考虑以下:alias testCMD=PATH=$PATH
我可以跑
$ testCMD vim
但如果我声明它就行不通alias testCMD=$PATH
我也无法运行:
$ PATH vim
或者
$ $PATH vim
这与其他别名的工作方式有点违反直觉。我希望你能理解我的困惑。
答案1
您的 shell 存储各种称为环境变量。您的 PATH 只是这些环境变量之一的示例之一。
如果没有设置 PATH 变量,您将需要手动设置所执行的每个程序的完整路径。例如,你不能只是跑步date
,你需要/usr/bin/date
每次都跑步。如果您稍后在 中安装 Date 的自定义版本/usr/local/bin/
,则需要将其运行为/usr/local/bin/date
.
虽然不方便,但这并非不可能,所以您会看到 PATH 实际上是可选的。因此,PATH 的作用就是简单地自动检测程序的位置。
由于程序可以驻留在系统中的多个位置,因此 PATH 不仅仅是一个目录。相反,它是一个以冒号分隔的目录列表。当您在 shell 中执行命令时,shell 会搜索这些目录以尝试找到您要运行的命令。
回到该date
示例,您可以设置PATH=/usr/local/bin:/usr/bin
是否愿意在 中优先考虑自定义程序/usr/local/bin
,/usr/bin
如果不在 中,则回退到/usr/local/bin
。然后当你运行时date
,shell会/usr/local/bin/
在PATH列表的前面看到,所以它会找到/usr/local/bin/date
.如果您删除了/usr/local/bin/date
,shell 仍然会找到/usr/bin/date
,因为它/usr/bin/
在 PATH 中是第二个。
当你运行时alias testCMD=PATH=$PATH
,你会得到一个别名,它可能看起来有点像这样:
testCMD='PATH=.:/usr/local/bin:/usr/bin:/bin'
因此,当您运行时testCMD vim
,shell 看到的是,
PATH=.:/usr/local/bin:/usr/bin:/bin vim
这只是给出了一个一次性指令,告诉 shell 在哪里寻找vim
.如果您只是vim
单独运行,您会得到相同的结果,因为您的 testCMD 别名不会更改 PATH 的值。
如果更改 PATH,则会有以下差异:
$ PATH=/foo vim
bash: vim: command not found
因为 shell 试图在某个名为的目录中查找,但那里/foo
肯定没有。vim
继续查看您给出的不起作用的示例,这是因为您没有进行变量赋值。PATH=/foo vim
和之间是有区别的PATH vim
。在 中PATH vim
,shell 认为您正在尝试查找名为 的程序PATH
。然后 shell 将在每个目录中查找$PATH
名为 的程序PATH
。由于您(可能)在任何这些目录中都没有 PATH 命令,因此您会得到,
$ PATH vim
bash: PATH: command not found
vim
当仅使用 值作为前缀时,同样的原则也成立$PATH
:没有赋值,因此 shell 认为$PATH
它是某个程序的名称。这就是为什么你会得到:
$ $PATH vim
bash: .:/usr/local/bin:/usr/bin:/bin: No such file or directory
总的来说,您通常只需要在您的~/.bashrc
或~/.bash_profile
.例外情况是您要在各种工具链之间切换。这实际上就是 Python virtualenvs 的用途,自动重新配置 PATH。环境模块系统,例如左模是在需要时操作 PATH 的另一种强大方法。