我的 PATH 变量在哪里设置?

我的 PATH 变量在哪里设置?

我正在尝试将路径变量设置为如下所示:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin

并且由于某些原因,无论我编辑什么文件,变量最终总是看起来像这样(java 路径重复多次):

PATH=/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/java/jdk1.7.0_79/bin:/home/jgrande/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin:/usr/local/java/jdk1.7.0_79/bin:/usr/local/java/jdk1.7.0_79/jre/bin

我尝试编辑我的个人.bashrc.profile以及/etc/environment、、,并将其设置在中/etc/bash.bashrc。现在,其中的PATH变量与我上面发布的错误变量相同。但是,我尝试注释掉该行,甚至完全删除,但仍然无法解决问题。/etc/profile/etc/profile.djdk.sh/etc/profile.djdk.sh

否则,我注意到如果我以另一个用户身份登录,我将拥有正确的 PATH 变量,并且不会出现多次重复 java 的混乱变量。

所以,我想知道,我还没有检查过的 PATH 变量还可以在哪里定义?

答案1

PATH 可以设置在 bash 启动时读取的各种文件中。要查找所有文件,请运行以下命令:

grep --color -H 'PATH=' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login \
                     ~/.bash_aliases /etc/bash.bashrc /etc/profile \
                     /etc/profile.d/* /etc/environment 2> /dev/null

这些都是标准的。如果您还从其中一个中获取其他文件,事情可能会变得更加复杂。

无论如何,要修复它 - 假设你没有对全局文件做任何事情/etc/- 你可以运行这个:

sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases 

PATH将从这些文件中删除所有行设置。现在,在正确的位置添加正确的行:

pp='PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/jgrande/android-sdk-linux/platform-tools:/usr/lib/jvm/java-7-openjdk-amd64/bin/:/usr/lib/jvm/java-7-openjdk-amd64/jre/bin'
[[ -e '~/.bash_profile' ]] && echo "$pp" >> ~/bash_profile ||
                              echo "$pp" >> ~/.profile

当作为登录 shell 调用时,bash 会读取.bash_profile是否存在,如果不存在,则读取(如果存在,~/.profile它将忽略,但我认为不存在)。因此,上述命令将首先将所需路径保存为,然后检查是否存在,如果存在,则将路径定义添加到其中,如果不存在,则将其添加到。.profile.bash_login$pp~/.bash_profile~/.profile

将来,为了避免此类问题,请使用函数将目录添加到您的$PATH。将以下几行添加到您的~/.profile

pathmunge () 
{ 
    if ! echo "$PATH" | /bin/grep -Eq "(^|:)$1($|:)"; then
        if [ "$2" = "after" ]; then
            PATH="$PATH:$1";
        else
            PATH="$1:$PATH";
        fi;
    fi
}

然后,要在的开头添加一些内容$PATH,请将以下行添加到~/.profile

pathmunge "/path/to/foo"

并将其添加到最后:

pathmunge "/path/to/foo" after

$PATH如果尚不存在新目录,则该函数只会添加新目录。

答案2

您已将随机飓风应用到您的配置中!

如果您无法撤消对 中的文件的编辑/etc,则可能必须重新安装bash

您可以调整您的个人资料,PATH而无需更改任何文件/etc。例如阅读这些答案。我当然更喜欢我的答案。

man bash你可以通过阅读、man less,并留意、 使用INVOCATION部分来确定你到底在哪里出错了。每当它们似乎转移控制权(、)时,使用的命令来读取该文件。使用的命令搜索字符串以在每个文件中查找分配。记住要像 一样愚蠢。 man bashlesssource.less!less/PATH=PATHbash

您可以比较您的diff启动文件(.bashrc、、)和“另一个用户”的启动文件.profile( )。.bash_login$HOME

答案3

要查找$PATH环境变量发生更改的所有位置,请使用以下命令:

sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "PATH="

这将搜索系统上除虚拟文件系统目录之外的所有目录。在我安装三个发行版的情况下,返回了 697 个文件。


对于 OP 来说,更有针对性的方法是搜索特定的路径名​​。您可以查找设置 $PATH 中不寻常部分的程序,其中包含:

/usr/local/java/jdk1.7.0_79/bin

在终端中运行此命令:

sudo grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e "/usr/local/java/jdk1.7.0_79/bin"

如果 $PATH 中的第一个目录不是罪魁祸首,则搜索最后一个目录:

/usr/lib/jvm/java-7-openjdk-amd64/jre/bin

grep将返回设置 $PATH 的脚本/文件的名称。

相关内容