最近使用deepin配置JAVA环境时发现不论是修改/etc/profile还是 ~/.profile多次尝试后均无效,不得其解,最后通过官方论坛看到大神对deepin环境配置的解释,以及寻找到相关解决方案。为了解决这个问题跟着了baidu走了不少弯路,过程中也学到不少东西,所以梳理出来,希望不仅能对deepin用户起到帮助而且还能了解对LInux的一些运行机制。
从开机到登录Shell过程分析环境读取顺序
- linux开机过程:
BIOS/UEFI -> MBR/UEFI Executable -> Bootloader -> Kernel -> initramfs -> init
init过程会涉及到各种服务及其配置文件,最后会读取/etc/rc.local里面用户自定义的脚本,但是里面如果有环境变量之类的是不起作用的,因为读取这个文件时环境变量的配置还没启动生效。
- 登录Shell:
登录Shell时涉及到环境变量文件读取的顺序这里分登录Shell和非登录Shell情况讨论:
根据shell是登入shell还是非登入shell,所运行的启动脚本也会不一样,我们“su - ”是登入shell;“su ”是非登入shell
登录Shell:
~/.bash_profile —> ~/.bash_login —> ~/.profile 按照顺序这三个文件
非登录Shell:
非登陆shell只会读取~/.bashrc配置文件。
(图侵删,来自cndn用户Leshami,详解见参考链接)
小结:如果直接打开终端一般是属于nologin shell没有读取到环境变量配置,因而导致环境变量“失效”
其他解决方案(最简):
讲了这么多,最后还是用这个方法最简单方便,在~/目录下新建.xsessionrc文件,然后像正常配置/etc/profile一样配置、重启即可在nologin shell情况下使用环境变量。
具体原理受限于英语水平不太明白。具体链接:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=636108
参考资料:
https://blog.csdn.net/leshami/article/details/77198412
https://bbs.deepin.org/forum.php?mod=viewthread&tid=37049
https://www.linuxidc.com/Linux/2012-11/74463.htm