我正在尝试将路径变量设置为如下所示:
/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.d
jdk.sh
/etc/profile.d
jdk.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 bash
less
source
.
less
!
less
/
PATH=
PATH
bash
您可以比较您的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 的脚本/文件的名称。