我正在尝试设置一个正确的PATH
,但我想知道它应该包含什么。如果我有
/usr/bin/ls
/usr/local/bin/ls
我想要更喜欢其中的一个/usr/local/bin
,我应该使用以下哪一个?
PATH=/usr/local/bin/ls:/usr/bin/ls
PATH=/usr/local/bin:/usr/bin
或者完全是别的东西?
这不是per se一个适合 Stack Overflow 的问题。
我预计这将被关闭为“通用计算”或“太广泛”;
但是answer初学者经常需要,所以希望不要删除。
PATH
仅适用于目录,不适用于单个文件
来自POSIX标准(强调我的)
PATH
该变量应表示某些函数和实用程序在搜索仅通过文件名已知的可执行文件时应用的路径前缀序列。前缀应以冒号 ( ':' ) 分隔。 [...] 列表应从头到尾搜索,将文件名应用于每个前缀,直到找到具有指定名称和适当执行权限的可执行文件。
当你输入ls
进入你的外壳和你的PATH
被设定为/usr/local/bin/ls:/usr/bin/ls
那么你的 shell 将会...
...查找具有路径的可执行文件/usr/local/bin/ls/ls
(注意双ls
在最后)。
由于您的系统上不存在该路径,您的 shell 将继续查找具有该路径的可执行文件/usr/bin/ls/ls
(双倍的ls
再次)。这条路也不存在。
shell 无法使用所有路径找到可执行文件PATH
所以你的 shell 会打印类似的内容bash: ls: command not found
.
那么,我们学到了什么?列出的路径PATH
have成为目录。您无法列出单个文件。因此,您的情况的正确答案是PATH=/usr/local/bin:/usr/bin
.
事情变得有趣的地方
想象一下以下情况。您有两个版本的程序c1
和两个版本的程序c2
。不同版本存放在目录中/a/
and /b/
.
/a/c1
/a/c2
/b/c1
/b/c2
我们如何设置PATH
喜欢/a/c1
over /b/c1/
但同时/b/c2
over /a/c2
?
遗憾的是,没有办法直接实现这一点,因为我们只能指定目录PATH
。我们必须移动/重命名一些文件或创建符号链接并在路径内使用符号链接。一种可能的解决方案:
mkdir /c
ln -s /a/c1 /c/c1
ln -s /b/c2 /c/c2
export PATH=/c:/a:/b
尾随的:/a:/b
这里其实并不需要。我将它们包括在内的假设是/a
and /b
包含更多可执行文件c1
and c2
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)