返回部落格

如何在 Linux VPS 上讀取與設定環境變數和 Shell 變數

如何在 Linux VPS 上讀取與設定環境變數和 Shell 變數

大多數技術社群喜歡透過命令列介面 (CMD) 或 shell 與系統進行互動。一般來說,這能讓他們的工作更輕鬆。例如,您可以建立一個 shell 命令來自動執行多個任務,而不需要在圖形使用者介面 (GUI) 中點擊多個按鈕。

當您啟動 shell 或 CMD 程式時,它會編譯多個資訊。這些資訊設定了程式如何存取底層系統資源以及整體行為。您可以將其儲存在一個稱為環境(environment)的地方。環境由代表鍵值對(key-value pairs)的字串組成。在本教學中,我們將使用 Ubuntu 20.04 VPS 作為範例,引導您設定環境變數或 shell 變數。本指南應該也適用於其他 Linux 發行版。

環境變數與 Shell 變數有何不同?

當您啟動工作階段時,系統會從系統的’設定和設定檔中收集資訊。然後,這些資訊可供 shell 程序及其子程序使用。此資訊是以下格式的一組鍵值對:

變數的名稱(即鍵)區分大小寫。然而,按照慣例,通常會將它們設為大寫。這有助於您在其他上下文中區分它們。使用冒號 ‘:’ 字元,您可以為同一個變數分配多個值。同樣重要的是,確保在 = 周圍不要留空格。鍵就是變數,分為兩類:環境變數和 shell 變數。環境變數包含在整個系統範圍內定義的所有變數,並且可用於每個子 shell 或程序。它們有助於將資訊傳遞到您透過 shell 命令啟動的程序中。Shell 變數僅包括在特定 shell 工作階段中定義的變數。此外,它們僅包括專門在其 shell 執行個體中可用的變數。

列出環境變數和 Shell 變數

預設情況下,終端機提供兩個命令來列出環境變數和 shell 變數:env 或 printenv。它們在預設狀態下顯示相同的資訊。以下是這些命令的範例輸出:

使用 env:

environment variables Environmental and Shell Variables

使用 printenv:

printenv

如您所見,輸出是相同的。當您想要特定鍵的值時,就會有所不同。這時您將使用帶有變數名稱的 printenv:

printenv shell

若要查看多個值,您可以向 printenv 命令傳遞多個引數。這些值將按照您輸入引數的順序顯示:

printenv multiple commands

您也可以使用帶有變數名稱的 echo 命令來顯示變數的值:

echo variable

env 命令允許您透過傳遞如下語法的變數定義來修改程式執行的環境:

這允許您覆寫值或設定可由子程序使用的新值。printenv 和 env 命令會列出如上所示的環境變數。這些已經為系統程序定義好了。如果您想查看 shell 變數的清單,可以使用 set 命令。在不帶任何變數的情況下輸入 set 將傳回所有環境變數、shell 變數、區域變數和 shell 函數的清單:

set command Environmental and Shell Variables

變數可能太多。如果需要,您可以使用以下命令對它們進行分頁:

您可以透過指定 set 命令在 POSIX 中執行來進一步清理輸出,從而不列印 shell 函數。這裡我們在子 shell(命令處理器的獨立執行個體)中執行,以防止命令變更目前的環境:

以上列出了系統上可用的所有環境和 shell 命令。您可以使用以下命令來縮減輸出,以嘗試僅獲取 shell 變數:

上述指令的範例輸出如下:

lists all environmental and shell commands Environmental and Shell Variables

雖然該指令可能包含一些環境變數,但它將有助於您區分 Shell 變數和環境變數。這是因為 set 指令會用引號包圍變數的值,而 printenv 和 env 指令則不會。Shell 變數對於為工作階段設定持續性數值非常有用,同時又不會將變更永久寫入檔案中。

常見環境變數

USER – 目前登入的使用者。
SHELL – 將用於解析您所輸入指令的 Shell。預設為 bash,但您可以進行更改。
HOME – 目前使用者的家目錄。
TERM – 指定要模擬的終端機類型。顯示目前模擬的終端機。
PWD – 目前的工作目錄。
OLDPWD – 前一個工作目錄。這有助於在您輸入變更目錄指令 cd 時,讓 Shell 切換回前一個目錄。

EDITOR – 當您在終端機中輸入 edit 時的預設檔案編輯器。
LS_COLORS – 定義當您輸入 ls 指令時用於加入彩色輸出的顏色代碼。它有助於區分檔案類型並向使用者提供資訊。
LOGNAME – 目前使用者的名稱。
MAIL – 定義目前使用者信箱的路徑。
LANG – 定義目前的語系設定。
PATH – 指定執行指令時要搜尋的目錄清單。在執行指令期間,系統會搜尋這些目錄並使用第一個找到的可執行檔。
_ – 上一次執行的指令。

常見 Shell 變數:

BASH_VERSION – 易讀格式輸出的 bash 版本。
BASH_VERSINFO – 機器可讀格式輸出的 bash 版本。
BASHOPTS – 執行 bash 時所使用的選項清單。可用於確定 Shell 環境是否會如您預期般運作。

COLUMNS – 用於在螢幕上繪製輸出的欄位寬度數量。
DIRSTACK – 可搭配 pushd 和 popd 指令使用的目錄堆疊。
HOSTNAME – 電腦目前的執行主機名稱。
HISTFILESIZE – 儲存在檔案中的指令歷程記錄行數。
HISTSIZE – 記憶體中允許的指令歷程記錄行數。
IFS – 用於分隔命令列上輸入內容的內部欄位分隔符號。預設為空白字元。
SHELLOPTS-用於設定 Shell 選項。
UID-目前使用者的 UID。
PS1– 主要命令提示字元定義。這用於定義當您啟動 Shell 工作階段時,提示字元的外觀。
PS2 – 宣告當指令跨越多行時的次要提示字元。

設定環境與 Shell 指令

首先,如前所述,我們將保持變數名稱全部為大寫。接下來,我們將逐步建立 Shell 變數。最後,我們將建立環境變數。

建立 Shell 變數

讓我們從常見的 hello world 開始。在您的終端機中輸入以下內容:

使用引號是因為變數中含有空格。請注意,我們使用了單引號,因為驚嘆號是一個特殊字元,應該要被逸出或放入單引號中。現在,您已經建立了第一個 Shell 變數。它僅在目前的 Shell 工作階段中可用。Shell 變數不適用於子 Shell 和程序。您可以使用 set 搭配 grep 指令將其列印到終端機:

print variable

或者使用 echo 顯示該值,並使用 $ 符號和變數名稱來引用它:

echo variable

如果您嘗試使用 printenv 進行列印,它將不會顯示任何輸出。這有助於您確認這不是一個環境變數:

printenv variable

建立環境變數

先前建立的 Shell 變數可以使用 export 指令轉換為環境變數。首先,您建立一個 Shell 變數。然後,要建立環境變數,您需要使用 export 指令。執行此指令後,該變數將可用於子 Shell 和程序:

現在,如果您使用 printenv 命令進行測試,應該會看到該變數和值:

printenv variable value

您也可以使用以下語法,在一個步驟中建立環境變數:

環境變數只會傳遞給子 Shell,而不會傳遞給父 Shell。這有助於防止子程序影響呼叫它們的程式的環境。

降級與取消設定變數

如果您一直按照本教學進行到現在,那麼您仍然將 MY_FIRST_VAR 定義為環境變數。您可以透過輸入帶有 –n 旗標的 echo 命令,將其改回 Shell 變數:

如果您使用 printenv 進行測試,將不會有任何輸出。然而,echo 命令仍會顯示它,因為它仍然是一個 Shell 變數:

echo vs prinenv command

您可以使用 unset 命令來取消設定 Shell 變數或環境變數。並且您可以使用 echo 來確認它已不存在。如您所見,它沒有顯示任何輸出:

unset variable Environmental and Shell Variables

在登入時設定環境變數

許多程式的執行都依賴環境變數。由於每次想要執行程式時都設定變數效率不高,Linux 提供了一種定義變數並將其儲存到檔案中的方法。這樣,它們就可以在登入時自動設定。Shell 會根據工作階段的啟動方式讀取不同的設定檔。這些將在下面討論:

Shell 工作階段的類型及其差異

  • 登入 Shell 工作階段 – 從驗證使用者開始。當您透過 SSH 或終端機工作階段登入時,就會設定該工作階段。
  • 非登入 Shell 工作階段 – 當您從已驗證的 Shell 中啟動新的 Shell 時開始。您可以使用 bash 命令啟動新的 Shell。不需要驗證資訊。
  • 互動式 Shell 工作階段 – 附加到終端機工作階段的 Shell 工作階段。
  • 非互動式 Shell 工作階段 – 未附加到終端機工作階段的 Shell 工作階段 – 在背景執行。

工作階段分為登入或非登入,以及互動式或非互動式。當您透過 SSH 登入並開始 Shell 工作階段時,那將是一個登入且互動式的 Shell 工作階段。當您在終端機上執行指令碼時,它通常在非登入、非互動式的工作階段中執行。Shell 工作階段也可以是兩者的組合。那麼,會選用哪一個設定檔呢?

登入工作階段首先會讀取 /etc/profile 目錄中的設定檔。其次,它會檢查使用者家目錄中特定於該使用者的設定檔。在 ~/.bash_profile、~/.bash_login 和 ~/.profile 中,只會讀取找到的第一個檔案,並忽略所有其他檔案。非登入工作階段將首先讀取 /etc/bash.bashrc,然後是 ~/.bashrc。非互動式工作階段則會讀取名為 BASH_ENV 的環境變數,以獲取用於定義新環境的檔案名稱。

實作環境變數

當您設定變數時,請務必根據我們上面的討論,注意您將它們放在哪個檔案中。這將確保某些變數僅在某些工作階段中可用,從而提供彈性。您不會希望在某個工作階段中遺失關鍵變數。

在某些情況下,我們希望變數同時存在於登入和非登入工作階段中。幸運的是,大多數 Linux 發行版預設已將登入設定配置為讀取非登入設定,並使其對您的程序可用。因此,您只需在非登入設定檔中定義變數即可。通常,我們設定特定於使用者的環境變數,並希望我們的設定在登入和非登入 Shell 工作階段中都可用。因此,我們將使用 ~/.bashrc 檔案。我們將使用 nano 來編輯該檔案。在您的終端機中輸入以下內容以開啟檔案:

在打開的設定檔中,您已經可以看到幾個變數。您可以像使用命令列時一樣添加環境變數。只需輸入以下命令:

您可以將它們添加到檔案中的任何位置——在新行上,且不要在迴圈函式內部。然後,儲存並關閉檔案。您啟動的下一個 shell 工作階段都將從該檔案讀取。如果您希望目前的 shell 讀取您剛剛添加的設定而無需重新啟動它,您可以使用以下命令:

您應該在以下任一檔案中添加系統級別的環境變數:/etc/profile、/etc/bash.bashrc 或 /etc/environment。

總結

最後,您現在可以設定 shell 和環境變數,並享受這些工具為您的 VPS 帶來的強大功能!它有許多優點,例如自動化執行某些程序、需要驗證資訊的自動部署設定、將變數傳遞給子程序等等。環境變數還可以幫助您在公共儲存庫中隱藏驗證資訊等敏感資料。有了這個基礎,您可以建立複雜的指令碼,並透過命令列自動執行,而不需要使用者不斷輸入。

祝您運算愉快!

author

Akshay Nagpal

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。