除了系統級的初始化腳本之外,一般有兩個用戶級的腳本:.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,不須要了。問題總算圓滿地解決。變量