在 .bashrc、.profile、.bash_profile 等之間進行選擇

在 .bashrc、.profile、.bash_profile 等之間進行選擇

這很尷尬,但是在全職使用 POSIX 系統多年之後,我仍然很難弄清楚 shell 定制是否應該進入.bashrc.profile或其他地方。更不用說一些特定於作業系統的配置文件,例如.pam_environment.

是的,我知道如何瀏覽文件並了解每個文件何時加載或未加載。我想知道是否有人有關於如何決定將給定類型的自訂放入哪個文件的全面指南。

答案1

長話短說:

  • ~/.bash_profile應該超級簡單,只需加載.profile.bashrc(按順序)

  • ~/.profile有與 bash 沒有特別相關的東西,例如環境變數(PATH和朋友)

  • ~/.bashrc在互動式命令列中有您想要的任何內容。供我使用的命令提示字元、EDITOR變數、bash 別名

其他一些注意事項:

  • 圖形應用程式或 sh (或作為 bash 呼叫)可用的任何內容sh都必須位於~/.profile

  • ~/.bashrc不得輸出任何內容

  • 任何應該只對登入 shell 可用的內容都應該放入~/.profile

  • 確保~/.bash_login不存在。

答案2

在過去的幾年裡,我有很多時間可以浪費,所以我研究了這個問題超過10分鐘。我不知道這是否是最好的佈局,這只是一種在幾乎所有情況下都能正常工作的佈局。

要求:

  • ~/.profile必須與任何 /bin/sh 相容 - 這包括 bash、dash、ksh 以及發行版可能選擇使用的任何其他命令。

  • 環境變數必須放入控制台登入(即「登入」shell)和圖形登入(即GDM、LightDM 或LXDM 等顯示管理器)均可讀取的檔案中。

  • 擁有很少的意義兩個都 ~/.profile~/.bash_profile。如果缺少後者,bash 將很樂意使用前者,並且任何特定於 bash 的行都可以透過檢查$BASH或來保護$BASH_VERSION

  • *profile和之間的區別*rc在於,前者用於「登入」shell,後者用於每次開啟終端視窗時。但是,「登入」模式下的 bash 不會 source ~/.bashrc,因此~/.profile需要手動執行。

最簡單的配置將是:

  • 有一個~/.profile設定所有環境變數(除了 bash 特定的變數),也許列印一兩行,然後~/.bashrc如果由 bash 運行則使用來源,否則堅持 sh 相容的語法。

    導出 TZ="歐洲/巴黎"
    匯出編輯器=“vim”
    如果[“$BASH”];然後
        。 ~/.bashrc
    正常運作時間
    
  • 有一個~/.bashrc執行任何特定於 shell 的設置,並透過檢查進行保護互動模式避免破壞像sftpDebian 上的東西(其中 bash 編譯時甚至可以選擇載入~/.bashrc非互動式 shell):

    [[ $- == *i* ]] ||返回0
    
    PS1='\h\w\$'
    
    啟動(){ sudo 服務“$1”啟動; }
    

然而,還有一個問題是某些非互動式命令(例如ssh <host> ls)跳過~/.profile,但環境變數對它們非常有用。

  • ~/.bashrc某些發行版(例如 Debian)編譯其 bash,並提供此類非互動式登入的選項。在這種情況下,我發現將所有環境變數(行export ...)移動到單獨的文件 ,~/.environ並從中獲取它很有用兩個都 .profile並且.bashrc,帶有一個守衛以避免重複執行:

    如果 ! [“$前綴”];然後   # 或 $EDITOR,或 $TZ,或 ...
        。 〜/.environ           # 通常 .environ 本身會設定的任何變量
    
  • 不幸的是,對於其他發行版(例如Arch),我還沒有找到非常好的解決方案。一種可能性是使用(預設啟用)pam_env PAM 模組,方法是將以下內容放入~/.pam_environment

    BASH_ENV=./.environ        # 不是拼字錯誤;它需要是一條路徑,但是〜不起作用
    

    然後,當然,更新~/.environunset BASH_ENV.


結論?貝殼是一種痛苦。環境變數是一個痛苦。特定於發行版的編譯時選項是巨大屁股痛。

答案3

看看這個ShreevatsaR 的優秀部落格文章。這是摘錄,但請前往部落格文章,其中包括對「登入 shell」等術語的解釋、流程圖以及 Zsh 的類似表格。

對於 Bash,它們的工作方式如下。向下閱讀相應的欄。執行 A,然後執行 B,然後執行 C,等等。

互動登入 互動式非登入 腳本
/etc/profile A
/etc/bash.bashrc A
~/.bashrc
~/.bash_profile B1
~/.bash_login B2
~/.profile B3
BASH_ENV A
~/.bash_logout C

答案4

我放棄了嘗試解決這個問題,並製作了一個腳本(~/.shell-setup),我從所有其他腳本中獲取了該腳本。

這種方法需要~/.shell-setup具備兩個特質:

  1. 僅運行一次,即使重複獲取(使用包括警衛
  2. 不要產生任何不需要的輸出(檢測輸出何時正常)

#1 是相當標準的,儘管在 shell 腳本中可能用得不多。

#2 比較棘手。這是我在 bash 中使用的:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

不幸的是我不記得我是如何想到這個的,也不記得為什麼偵測互動式 shell還不夠。

相關內容