处理重复的程序名称 bash

处理重复的程序名称 bash

我想知道是否$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 和一些论坛,但没有找到任何结论性的东西。

答案1

您的$PATH搜索将按顺序进行。例如,如果echo $PATHshow /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专门允许这样做。

答案2

Bash(实际上是所有 shell)将执行第一的找到给定名称的可执行文件,按照指定的顺序进行搜索$路径在环境中。

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

相关内容