处理重复的程序名称bash

我想知道$PATH级联条目.你们都需要在这里与我一起迈出一大步的信念,但就在这里.

假设我们在/usr/bin/java中有一个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和一些论坛上搜索过,但没有找到任何结论.

最佳答案
您的$PATH将按顺序搜索.例如,如果echo $PATH显示/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

然后源.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中第一个允许这样做的目录.

转载注明原文:处理重复的程序名称bash - 代码日志