Ubuntu 16.04中PATH变量设置重启失效问题求助
首先,从你的描述来看,~/.profile肯定是被加载了——毕竟HP_HOME环境变量每次重启都能正常生效,这说明文件里的代码确实执行了。那PATH被重置的问题,大概率是后续有其他配置文件覆盖了你的PATH设置,而HP_HOME因为没有其他地方修改,所以保留了下来。
下面给你一步步排查和解决的方法:
1. 先确认.profile执行后的PATH是否正确
先做个小测试,验证.profile里的PATH设置确实被执行了:
在~/.profile的最后一行添加:
echo "$(date): profile loaded, PATH = $PATH" >> ~/path_debug.log
然后重启系统,登录后打开终端,查看~/path_debug.log里的内容。如果日志里的PATH包含你添加的那些路径(比如/home/patrick/.npm/bin),那说明.profile的设置没问题,问题出在登录后某个后续的配置文件重置了PATH。
2. 检查~/.bashrc是否覆盖了PATH
Ubuntu的终端默认是交互式非登录shell,每次打开终端都会加载~/.bashrc。如果你的~/.bashrc里有直接重置PATH的语句(而不是追加),就会覆盖.profile里的设置。
比如,如果你在~/.bashrc里看到类似这样的代码:
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
这就是直接重置了PATH,而不是在现有基础上追加。解决方法是把你需要的PATH追加语句移到~/.bashrc里,或者修改这行代码,把你的路径加进去:
export PATH="/home/patrick/.npm/bin:/home/patrick/.npm-global/bin:/home/patrick/.config/composer/vendor/bin:/usr/local/bin/composer:/home/patrick/.local/share/umake/bin:$PATH"
3. 检查是否存在/.bash_profile或/.bash_login
bash的登录shell加载配置文件的顺序是:/etc/profile → ~/.bash_profile → ~/.bash_login → ~/.profile。如果你的用户目录下存在~/.bash_profile或~/.bash_login,bash会优先加载它们;不过你这里HP_HOME生效了,说明.profile也被加载了,可能是这两个文件里调用了.profile。但还是建议检查一下这两个文件里有没有修改PATH的语句,比如是否有重置PATH的代码。
4. 检查桌面环境的session配置
Ubuntu 16.04默认用Unity桌面,登录时桌面session可能会读取一些额外的配置文件,比如~/.xsessionrc,或者/etc/X11/Xsession.d/下的系统级脚本。这些脚本可能会重新读取/etc/environment里的PATH,或者自己设置PATH,从而覆盖你在.profile里的修改。
解决方法是把你的PATH追加语句也添加到~/.xsessionrc里(如果这个文件不存在就创建它),内容和.profile里的一样:
export PATH=/home/patrick/.npm/bin:$PATH export PATH=/home/patrick/.npm-global/bin:$PATH export PATH=/home/patrick/.config/composer/vendor/bin:$PATH export PATH=/usr/local/bin/composer:$PATH export PATH=/home/patrick/.local/share/umake/bin:$PATH
快速临时解决方法
如果暂时不想排查,最稳妥的方式是把PATH的追加语句同时放到~/.profile和~/.bashrc里,这样不管是登录shell还是交互式终端,PATH都会正确加载。
内容的提问来源于stack exchange,提问作者Patrick Seume




