比較惱人的 bash 初始化腳本 ~/.profile 失效問題

除了系統級的初始化腳本之外,一般有兩個用戶級的腳本:.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; figet

這是Debian Wiki 上的解決辦法。可是這一方案有一個潛在的問題,那就是它的語法受限。緣由大概是,X session 是由 /bin/sh 啓動的,而非 bash,因此它支持的語法有限。我曾經試過將須要添加進 $PATH 的目錄寫在一個數組中,而後 for 循環遍歷逐個添加進環境變量中。結果死活不生效,然而本身開一個終端窗口,手動 source 該文件的確是生效的。這個問題排查了好久才弄清楚緣由。io

  • 在啓動 X 會話前,先啓動一個 bash 登錄 shell,由它 source .profile,而後再啓動 X session。編輯 ~/.xsession 爲以下內容:
#!/bin/bash --login
exec x-session-manager

要注意的是,這是一個可執行腳本,記得加上可執行權限 chmod +x ~/.xsession。同時,刪除掉上面的 .xsessionrc,不須要了。問題總算圓滿地解決。變量

相關文章
相關標籤/搜索