如果想要清楚的了解環境變量,我覺得我們需要先大致搞清楚一個簡單的事——什么是會話?
會話大致是什么?
? ? ? ?在這里我們的目的是更好的理解環境變量,所以適當講解一下會話即可。通常我們都是用xshell連接遠程服務器,都會打開一個會話,我們這次xshell連接之后所運行的所有進程都在這次連接所打開的會話里。如下圖所示
- 操作系統會為每個連接都創建一個會話,即使是來自同一個用戶的每次連接。
- 操作系統會為每個會話創建一個偽終端,此時大家可以將自己眼前的xshell的頁面看做這個偽終端,就仿佛就是遠程服務器上的偽終端一樣。而大家可以把偽終端當做真正的終端一樣,之所以叫做偽終端,是因為畢竟是服務器虛擬出來的,不是真實的物理終端而已。
- 每個偽終端都會關聯一個bash,當在偽終端中執行諸如“ls" "cd"等命令時,偽終端會把命令交給bash去執行
- 本次連接中啟動運行的所有進程都是在其對應的會話中運行的
- 當xshell關閉連接,該會話中的所有進程(除了守護進程,初學者就當做所有進程即可)都會收到一個退出信號,進而所有進程都會退出,偽終端和bash也會推出,會話結束。
什么是環境變量?
? ? ? ?大家需要對環境變量有個感性的認識。當我們在執行程序時,一般需要給出程序完整的路徑名如“/home/tom/exe”;可是對于一些程序如“ls" "cd"等程序,我們卻可以直接運行,而無需添加完整的路徑名。這個過程中操作系統肯定使用了某種策略:當輸入“ls"后,操作系統發現當前目錄下沒有這個程序,它會給"ls"程序添加正確的路徑名,這個正確的路徑名當然對應的就是“ls"真實所在的目錄名。那么它如何添加的呢?操作系統中有一個文件,文件里面有一個變量,這個變量大概長這樣:PATH="/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/heng/.local/bin:/home/heng/bin"
PATH是變量名,后面是冒號分割的變量值。
????????它是這樣添加的:輸入“ls"后,發現不在當前目錄,于是它就去操作系統中找一個特定的文件,然后在文件查找PATH這個變量,然后拿著冒號分隔開的變量值一個一個去試,終于得到正確的”ls“路徑名。”ls"運行成功。PATH就是環境變量,就是眾多環境變量其中的一員,用于實現正確啟動程序這個特定的用途。
環境變量可以在哪?
- 在系統級配置文件中
- 在用戶級配置文件中
- 在當前會話臨時文件中
? ? ? ?這三個地方都什么意思:以PATH這個環境變量來舉例,它可以在這三個地方中的任何一個地方;如果在系統級配置文件中,每個用戶都可以看到,每個用戶都可以使用;如果在用戶級環境變量中,只有該用戶可以看到,只有該用戶可以使用;如果在當前會話臨時文件中,只有此次會話可以看到,下次連接就看不到了。接下來,會詳細給大家解釋。
會話與環境變量加載
- 假設系統級配置文件的文件名叫做A。
- 假設tom這個用戶的用戶級配置文件叫做tomB,xu這個用戶的用戶級配置文件叫做xuB。
- 假設tom第一次會話的臨時文件叫做tomC1,xu此次會話的臨時文件叫做xuC1。
- 假設tom第二次會話的臨時文件叫做tomC2。
? ? ? xhsell進行連接時,會話第一步加載系統級配置文件,第二步加載用戶級配置文件,而會話中的臨時文件是會話中自己定義的環境變量,馬上就說。所以在系統級配置文件中的環境變量每個用戶都可以使用,而對于在用戶級配置文件中的環境變量由于tom只能加載自己的用戶級配置文件tomB,不能加載xu的用戶級配置文件xuB,所以tom只能看到自己用戶級配置文件中的環境變量,也就是說定義在用戶級配置文件中的環境變量,只能被該用戶看到。接下來,會實操給大家看。
如何創建、查看等操作環境變量?
如何查看環境變量?
????????echo $環境變量名--->用于查看指定的環境變量
????????用env命令查看當前用戶全部的環境變量
如何創建環境變量?
? ? ? ? export用于創建環境變量,接下來我們創建一個變量名為test_var,值為hello的環境變量
????????在終端命令行輸入export test_var="hello"所創建的環境變量,處在當前會話臨時文件中,只在當前會話可見。我們讓tom創建這個環境變量,然后再打開一個會話,做個測試。
????????可以看到在第二個連接創建的會話中,無法查看其他會話中的環境變量。
將環境變量創建到配置文件中
????????前面講到 “xhsell進行連接時,會話第一步加載系統級配置文件,第二步加載用戶級配置文件” 。那么用于處理環境變量的系統級配置文件和用戶級配置文件究竟是那個文件呢,或者說是那些文件呢?
- 用戶級別環境變量定義文件:
~/.bashrc
、~/.profile
(部分系統為:~/.bash_profile
) - 系統級別環境變量定義文件:
/etc/bashrc
、/etc/profile
(部分系統為:/etc/bash_profile
)、/etc/environment
????????我們將test_var="hello"創建到用戶級配置文件~/.bashrc中,然后
source ~/.bashrc加載使其生效,最后看看在第二個終端中能不能看到,按照我們之前所講,用戶級環境變量在這個用戶所登錄的任何一個會話中都是可以看到的。
? ? ? ? 在第一個會話中,在home/tom目錄下使用:vim .bashrc(~/.bashrc和~/.profile都是環境變量的用戶級配置文件,在任意一個文件中添加環境變量都可以,效果一樣,后續系統級配置文件同理)
????????然后在第二個會話中使用source ~/.bashrc加載使其生效
? ? ? ? 確實正如我們所預料。
????????至于測試在環境變量的系統級配置文件中添加環境變量,然后會使所有用戶都看到的測試實驗,對于大家來說,已經是很簡單了,不再贅述。
常見的環境變量都有哪些?
? ? ? ? 了解常見的環境變量都有哪些,有助于大家進一步感性認識環境變量。
- PATH:決定了 shell 將到哪些目錄中尋找命令或程序
- HOME:當前用戶主目錄(就是用戶登錄linux系統中時,默認的目錄
- USER:當前用戶的用戶名。
- HISTSIZE:歷史記錄數
- LOGNAME:當前用戶的登錄名
- HOSTNAME:指主機的名稱
????????還有很多常見的環境變量,這里舉出這幾個是為了稍加講解讓大家進一步認識環境變量。
????????PATH這個環境變量肯定在系統級配置文件里,當然了也可以同時在用戶級配置文件里,更可以同時在會話的臨時文件里。那么假如系統級配置文件里test_val="111",用戶級配置文件里test_val="222",而會話臨時文件里test_val="333",當你執行echo $test_val時會輸出什么呢?答案是:333。加載步驟為:系統級配置文件--->用戶級配置文件--->會話臨時文件,這個過程采用覆蓋策略。
·? ? ? ? HOME這個環境變量,邏輯上來講是不是完全可以在用戶級配置文件里呀。其實究竟在哪里并不重要,重要的是大家理解這個邏輯即可。
? ? ? ? 環境變量還有很多細節問題,如各個配置文件如何執行,如何在編寫代碼時獲取使用環境變量。在大家總體上理解好環境變量的基礎上,剩下的事已經很簡單了,大家用到時查閱相關資料即可。