Linux 上的 .bashrc 和 .profile 有什麼區別?

已發表: 2022-09-29
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com

登錄到運行 Bash 的 Linux 機器會導致讀取某些文件。 他們配置你的 shell 環境。 但是讀取哪些文件以及何時讀取可能會令人困惑。 這就是真正發生的事情。

不同類型的外殼

啟動 shell 時獲得的環境由配置文件或配置文件中保存的設置定義。 這些包含建立諸如文本顏色、命令提示符、別名以及在您鍵入程序名稱時搜索可執行文件的路徑等信息。

有許多不同的文件——在文件系統的不同位置——存儲這些設置。 但在我們開始查看啟動 shell 時讀取了哪些文件之前,我們需要清楚您使用的是哪種類型的 shell。

打開計算機時究竟會發生什麼?
相關當您打開計算機時究竟會發生什麼?

登錄 shell 是您登錄的 shell。 當您啟動計算機並登錄時,在圖形桌面環境下有一個登錄 shell。 如果您通過 SSH 連接連接到另一台計算機,您也將登錄到登錄 shell。

打開終端窗口時獲得的 shell 類型是非登錄 shell。 當您已經登錄時,您無需進行身份驗證即可啟動 shell。登錄和非登錄 shell 是交互式 shell。 您可以通過輸入說明、按“Enter”鍵並閱讀屏幕上的響應來使用它們。

也有非交互式外殼。 這些是執行腳本時啟動的 shell 類型。 該腳本在新的 shell 中啟動。 腳本頂部的 shebang #!/bin/bash指示應該使用哪個 shell。

 #!/bin/bash

echo -e "你好,世界!\n"

此腳本將在非交互式 Bash shell 中運行。 請注意,即使 shell 是非交互式的,腳本本身也可以。 該腳本打印到終端窗口,並且可以很容易地接受用戶輸入。

相關: 9 個 Bash 腳本示例讓您開始使用 Linux

非交互式外殼

非交互式 shell 在啟動時不會讀取任何配置文件。 它們確實繼承了環境變量,但它們對別名一無所知,例如,它們是在命令行中定義的,還是在配置文件中定義的。

您可以通過查看作為命令行參數傳遞給它的選項來測試 shell 是否是交互式的。 如果選項中有“i”,則 shell 是交互式的。 Bash 特殊參數$-包含當前 shell 的命令行參數。

 [[ $- == *i* ]] && echo '交互式' || echo '非交互' 

用於識別交互式和非交互式 shell 會話的 Bash 測試

讓我們創建一個名為xc的別名,意思是“貓”。 我們還將檢查我們是否設置了$PATH變量。

 別名 xc=cat
 迴聲 $PATH 

設置別名並回顯 $PATH 的值

我們將嘗試從這個小腳本中訪問這兩個。 將此腳本複製到編輯器中並將其保存為“int.sh”。

 #!/bin/bash

xc ~/text.dat
迴聲“變量=$PATH”

我們需要使用chmod使腳本可執行。

 chmod +x int.sh 

使用 chmod 使腳本可執行

讓我們運行我們的腳本:

 ./int.sh 

運行無法訪問別名但可以訪問繼承的環境變量的腳本

在其非交互式 shell 中,我們的腳本不能使用別名,但可以使用環境變量。 交互式 shell 在使用配置文件和配置文件方面更有趣。

相關:如何在 Linux 上的 Bash 中設置環境變量

交互式登錄外殼

有兩種類型的交互式登錄 shell。 一種是讓您登錄計算機的外殼。 在桌面上,這通常是桌面環境下的外殼。 無論您使用的是窗口桌面環境還是平鋪桌面環境,都必須通過 Linux 系統對您進行身份驗證並允許您登錄。

在沒有安裝桌面環境的服務器上,您可以直接登錄到交互式 shell。 如果您退出桌面環境並訪問終端,您可以在台式計算機上執行相同的操作。 在 GNOME 上,您可以使用 Ctrl+Alt+F3 組合鍵來執行此操作。 要返回 GNOME 會話,請按 Ctrl+Alt+F2 組合鍵。 您通過 SSH 連接的 shell 也是登錄 shell。

調用的配置文件和配置文件可以使用環境變量進行設置,因此它們可能因發行版而異。 此外,並非每個發行版都使用所有文件。 在通用 Bash 安裝中,交互式登錄 shell 讀取“/etc/profile”文件。 這包含系統範圍的 shell 配置選項。 如果它們存在,該文件還會讀取諸如“/etc/bash.bashrc”和“/usr/share/bash-completion/bash_completion”之類的文件。

然後 Bash 會查找“~/.bash_profile”文件。 如果它不存在,Bash 會查找“~/.bash_login”文件。 如果該文件不存在,Bash 會嘗試查找“.profile”文件。 一旦找到並讀取其中一個文件,Bash 就會停止搜索。 所以在大多數情況下,“~/.profile”根本不可能被讀取。

通常,您會在“~/.bash_profile”中找到類似的內容,或者作為一種支持,在“~/.profile”文件中:

 # 如果運行 bash
如果 [ -n "$BASH_VERSION" ]; 然後
  # 包含 .bashrc 如果存在
  如果 [ -f "$HOME/.bashrc" ]; 然後
    . "$HOME/.bashrc"
  菲
菲

這將檢查活動 shell 是否為 Bash。 如果是,它會搜索“~/.bashrc”文件並在找到時讀取它。

交互式非登錄外殼

Bash 交互式非登錄 shell 讀取“/etc/bash.bashrc”,然後讀取“~/.bashrc”文件。 這允許 Bash 具有系統範圍和用戶特定的設置。

在編譯 Bash 時,可以使用編譯標誌更改此行為,但遇到不來源和讀取“/etc/bash.bashrc”文件的 Bash 版本將是一種罕見且特殊的情況。

每次您在桌面上打開終端窗口時,這兩個文件都用於配置該交互式非登錄 shell 的環境。 由應用程序啟動的 shell 也會發生同樣的情況,例如 Geany IDE 中的終端窗口。

您應該將配置代碼放在哪裡?

放置個人定制代碼的最佳位置是在“~/.bashrc”文件中。 您的別名和 shell 函數可以在“~/.bashrc”中定義,它們將被讀入並在所有交互式 shell 中可供您使用。

如果您的發行版沒有在登錄 shell 中讀取您的“~/.bashrc”,而您希望它這樣做,請將此代碼添加到您的“~/.bash_profile”文件中。

 # 如果運行 bash
如果 [ -n "$BASH_VERSION" ]; 然後
  # 包含 .bashrc 如果存在
  如果 [ -f "$HOME/.bashrc" ]; 然後
    . "$HOME/.bashrc"
  菲
菲

模塊化是最好的

如果你有很多別名,或者你想在多台機器上使用相同的別名,最好將它們存儲在它們自己的文件中,並且與你的 shell 函數一樣。 您可以從“~/.bashrc”文件中調用這些文件。

在我們的測試計算機上,別名存儲在一個名為“.bash_aliases”的文件中,一個名為“.bash_functions”的文件保存著 shell 函數。

您可以像這樣從“~/.bashrc”文件中讀取它們:

 # 讀入我的別名
如果 [ -f ~/.bash_aliases ]; 然後
  . ~/.bash_aliases
菲

# 讀入我的 shell 函數
如果 [ -f ~/.bash_functions ]; 然後
  . ~/.bash_functions
菲
如何在 Linux 上創建別名和 Shell 函數
相關如何在 Linux 上創建別名和 Shell 函數

這使您可以輕鬆地在計算機之間輕鬆移動別名和函數。 您只需將上面的行添加到每台計算機上的“~/.bashrc”文件中,並將包含別名和 shell 函數的文件複製到每台計算機上的主目錄。

這意味著您不需要將所有定義從一台計算機上的“~/.bashrc”複製到每台其他計算機上的“~/.bashrc”文件中。 這也比在計算機之間複製整個“~/.bashrc”文件要好,尤其是當它們在不同的發行版上運行 Bash 時。

總之

您真正需要了解的文件是:

  • /etc/profile :系統範圍的配置設置。 由登錄 shell 使用。
  • ~/.bash_profile :用於保存個人用戶的設置。 由登錄 shell 使用。
  • ~/.bashrc :用於保存個人用戶的設置。 由交互式非登錄 shell 使用。 也可以從你的“~/.bash_profile”或“~/.profile”文件中調用登錄shell。

一種方便的方法是將您的個人設置放在“~/.bashrc”中,並確保您的“~./bash_profile”文件調用您的“~/.bashrc”文件。 這意味著您的個人設置保存在一個文件中。 您將在登錄和非登錄 shell 之間獲得一致的 shell 環境。 將此與將別名和 shell 函數存儲在非系統文件中相結合是一種簡潔而強大的解決方案。