处理重复的程序名称bash


3

我想知道是否$PATH 级联条目。在这里,你们所有人都需要与我一起迈出信心的飞跃,但事情确实如此。

假设我们有一个Java可执行文件,/usr/bin/java但此版本非常旧且过时。不幸的是,我们没有su访问权限,所以我们不能仅仅替换它。但是,我们可以在本地下载JRE / JDK的当前版本,并指向更新的版本。我的问题是,当我们有两个或多个具有相同名称但在两个或多个不同位置的可执行文件时,bash如何处理?当我们输入java控制台时,bash是否会以某种方式选择执行哪一个?假设我们/usr/bin还有许多其他可执行文件,那么$PATH看起来像这样的东西如何正常工作?

理想情况下,键入时java -version应该看到:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

代替

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM(build 24.45-b08, mixed mode, sharing)

我确定这个问题已经被问过了,并且与它相关联。我在SE,SO和一些论坛上闲逛,但没有发现任何结论。

Answers:


5

您将$PATH被顺序搜索。例如,如果echo $PATHshows /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin,将依次搜索每个目录中的给定命令(假设该命令不是别名或内置的shell)。

如果要基于每个用户覆盖特定的二进制文件(或者您无权覆盖您自己以外的其他用户),建议bin您在主目录中创建一个目录,然后该目录前添加 PATH变量目录。

像这样:

$ cd ~
$ pwd
/home/joe
$ mkdir bin
$ echo "$PATH"
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> .bash_profile

然后source .bash_profile,新PATH定义将生效(或仅注销并登录,或重新启动终端仿真器)。

$ source .bash_profile
$ echo "$PATH"
/home/joe/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

现在,您放入的所有可执行文件/home/joe/bin/将优先于系统二进制文件和可执行文件。


请注意,如果您确实具有系统访问权限,并且覆盖应该适用于所有用户,则放置覆盖可执行文件的首选位置是/usr/local/bin,这是为此目的而设计的。事实上往往/usr/local/bin已经在第一个目录$PATH明确允许这样。


甜甜的,正是我想要的!
djthoms

我想补充一点,一些命令是散列的。哈希命令将可执行文件与该命令相关联,因此无需搜索即可直接执行该文件PATH。因此,在那种情况下,不一定要执行第一个匹配PATH
gardenhead

2
仅在正在运行的Shell的生存期内对命令进行哈希处理;当然,散列的是路径中的第一个匹配程序。因此,任何此类混乱都仅限于安装新程序时已经处于活动状态的Shell会话的生存期。有多种方法可以重建过期的哈希值(请参阅参考资料help hash下的内容bash),但是开始一个新的会话几乎总是更简单。
亚历克西斯

1

Bash(实际上是所有shell)将按照环境中$ PATH定义的顺序执行搜索到的第一个可执行文件。

或者简单地说:以$ PATH顺序找到的第一个可执行文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.