通过别名执行 PATH

通过别名执行 PATH

我不明白 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 的另一种强大方法。

相关内容