我的 PATH 变量在哪里设置?

use*_*942 7 bash java .profile environment-variables bashrc

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

/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
Run Code Online (Sandbox Code Playgroud)

并且出于某些原因,无论我编辑什么文件,该变量总是看起来像这样(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
Run Code Online (Sandbox Code Playgroud)

我试图编辑我的个人.bashrc.profile以及/etc/environment/etc/bash.bashrc/etc/profile,并将其设置/etc/profile.d。现在,有jdk.sh/etc/profile.d其中PATH变量是相同的不正确的一个I张贴以上。但是,我试图注释掉该行甚至jdk.sh完全删除,但仍然没有解决。

否则,我已经注意到,如果我以另一个用户身份登录,我将拥有正确的 PATH 变量,并且不会让 java 重复一堆乱七八糟的变量。

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

ter*_*don 7

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
Run Code Online (Sandbox Code Playgroud)

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

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

sed -i '/PATH=/d' ~/.bashrc ~/.profile ~/.bash_profile ~/bash.login ~/.bash_aliases 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当作为登录 shell 调用时,bash 读取.bash_profile是否存在,如果不存在,则读取~/.profile.profile如果.bash_login存在,它将忽略,但我认为它不存在)。因此,上面的命令将首先将您想要的路径另存为$pp,然后检查 a 是否~/.bash_profile存在,如果存在,则向其添加路径定义,如果不存在,则将其添加到~/.profile.

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

pathmunge () 
{ 
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)"; then
        if [ "$2" = "after" ]; then
            PATH=$PATH:$1;
        else
            PATH=$1:$PATH;
        fi;
    fi
}
Run Code Online (Sandbox Code Playgroud)

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

pathmunge "/path/to/foo"
Run Code Online (Sandbox Code Playgroud)

并将其添加到最后:

pathmunge "/path/to/foo" after
Run Code Online (Sandbox Code Playgroud)

$PATH如果新目录不存在,该函数只会将其添加到该目录中。


wal*_*tor 4

您已经对您的配置应用了随机飓风!

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

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

您可以通过阅读man bashman less,并用一只眼睛盯着启动文件中的、 useINVOCATION部分来准确确定您误入歧途的地方。每当他们似乎转移控制权 ( , ) 时,请使用的命令来读取该文件。使用的命令搜索字符串以查找每个文件中的分配。记住要像 一样愚蠢。 man bashlesssource.less!less/PATH=PATHbash

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