除了系统级的初始化脚本之外,一般有两个用户级的脚本:.bashrc, .profile。其中,前者是在每一次运行 bash 时导入,然后者是以 bash 做为登录 shell 登录进系统的时候起效。shell
好久之前,我图省事都是把配置脚本写在 .bashrc 中的,没有发现有什么问题。后面却发现写在 .profile 中的配置是不生效的。当个人配置写得愈来愈多,试图从新整理时发现了此问题。数组
缘由有些复杂。UNIX shell 太多了,不一样的 shell 有不一样的初始化脚本。 .bashrc .bash_profile .bash_login .bash_logout
这几个文件是 bash 所拥有的,若是换成其它的 shell,是不会鸟它们的。 .profile 有些特殊,它大概不属于任何 shell,而是一个用户级的“全局”配置脚本。也就是说其它 shell 也认可这个文件,会在登录时读取它。可是它的优先级是最低的。当home下存在 .bash_profile 或者 .bash_login 这两个文件的其中之一的时候,bash 就不鸟它了。那么,为何咱们的目录底下并无 .bash_profile 或者是 .bash_login,可是 .profile 仍然不生效呢?由于,它是 login shell 的初始化脚本,然而 X 并非 shell ...... 因此 X 仍然不鸟它。bash
有几个解决方案:session
把配置写在 .bashrc 中。而后在 .profile 中 source .bashrc(在 Debian 中,默认的 .bashrc 中已经有这个动做了)。在桌面中打开终端窗口,.bashrc 确定是会读取的。当从字符终端(ssh)登录时,.profile 会被读取,而后接着又 source .bashrc。配置仍然生效。ssh
X 拥有本身的初始化脚本 ~/.xsessionrc ,能够在里面加一句:code
if [ -r ~/.profile ]; then . ~/.profile; fi
get
这是Debian Wiki 上的解决办法。可是这一方案有一个潜在的问题,那就是它的语法受限。缘由大概是,X session 是由 /bin/sh 启动的,而非 bash,因此它支持的语法有限。我曾经试过将须要添加进 $PATH 的目录写在一个数组中,而后 for 循环遍历逐个添加进环境变量中。结果死活不生效,然而本身开一个终端窗口,手动 source 该文件的确是生效的。这个问题排查了好久才弄清楚缘由。io
#!/bin/bash --login exec x-session-manager
要注意的是,这是一个可执行脚本,记得加上可执行权限 chmod +x ~/.xsession
。同时,删除掉上面的 .xsessionrc,不须要了。问题总算圆满地解决。变量