Bash

試圖理解 .bashrc、env 和 export

  • March 16, 2016

免責聲明:使用 bash。

我只需要對我對這些事情的理解進行一些確認/更正:

  1. env基本上是顯示目前會話和任何子會話可訪問的目前環境變數(例如,如果我要bash進入子會話)。
  2. 如果我要設置一個新變數,例如MYMESSAGE="hello world!"then 它只會對我創建它的會話可見。例如,如果我進入兒童會話,我將無法使用echo $MYMESSAGE.
  3. 我可以export MYMESSAGE="hello world!"讓子會話訪問它。與將其添加到正在拉起export的任何內容中相同。env
  4. 但是,僅僅因為您export的某些東西,如果您碰巧關閉會話並重新啟動終端,它就不會堅持。.bashrc在您的目錄中編輯/home/username/並在那裡添加任何新的環境變數,因為此腳本在登錄時執行。

到目前為止我的理解正確嗎?

此外,我不完全了解細節的env來源。環境變數列表是否全部儲存在某個文件中,然後由 編輯/附加到.bashrc?我只是想了解所有這些是如何工作的。

你基本上是對的,但是還有一些額外的點……

有幾個“啟動文件” bash 可以執行——一些是為了向後兼容 bourne-shell (sh),其他的取決於你如何啟動 bash:你登錄到 X 了嗎?您是否登錄了 TTY?您是否從bash另一個(bash-)shell 開始?bash 是否作為腳本執行(非互動式)?因此 .bashrc 並不總是執行,也不是唯一的啟動文件。但是,在其他啟動文件中“獲取”(讀取和執行).bashrc 也是一個好主意,因此始終添加 .bashrc 的內容。使用man bash並特別查看有關 bash 如何啟動的部分…… FILES 部分還列出了 bash 使用的文件,包括所有啟動文件。如需更深入,請嘗試info bash.

除了您自己的啟動文件之外,/etc 中還有相應的“預設”全域啟動文件——這些文件通常bash在您自己的啟動文件之前讀取/執行。除了 bash 定義的環境變數之外,還有其他程序定義了自己的環境變數,這些程序可以補充甚至覆蓋 bash 設置的環境變數。特別值得注意的是 X(GUI),因為它將設置兩組不同的環境,這取決於 X 是從 VT 手動啟動(使用xinitstartx),還是由“顯示管理器”啟動(例如,xdmkdm) 所以您可以直接登錄到 X(X 在您啟動時啟動,並且您在 X 中有一個使用者名/密碼對話框)。

但是在啟動之前bashX或任何其他程序啟動之前,您將使用的大部分環境 - 環境變數 - 將已經設置好,例如通過login命令。您可以在 /etc/login.defs 和其他配置文件中找到其中的大部分內容。例如,PATH 變數將被設置 - 並且會根據您是 root 使用者還是普通使用者而有所不同。

因此,如果您查看作為引導、初始化和登錄過程的一部分執行的各種文件和腳本;您會發現大部分可以列出的變數env。然而,有些——比如CWD(目前工作目錄)——是由 shell(bash)本身自動設置(和更新)的。

當您執行命令時,會發生 bash 使用稱為 fork() 的系統呼叫。 bash基本上製作了自己的相同副本,除了孩子獲得一個新的PID(程序ID)並且它的PPID(父PID)是它的“母親”。否則它們是相同的 - 甚至包括環境變數……假設有問題的變數是通過 first exporting 使其可繼承的。您現在有兩份bash. 然後使用另一個系統呼叫 -exec() - ,它基本上用另一個程序替換子 bash 程序的“記憶體中”的 bash 程序 - 例如用ls,psmutt(無論你輸入什麼)……但是環境變數仍然存在,因此新程序繼承了它的環境bash. 這個孩子現在控制你的終端(除非你用 & 將命令放在後台),直到它終止,而你原來的 bash-shell(基本上)休眠。當命令終止時,您將返回到原來的bash-shell,它已準備好執行另一個命令。

引用自:https://unix.stackexchange.com/questions/268253