0. 思維導圖
1. 什麼是環境變量:
wiki上是這麼說的:
在所有 Unix 和 類Unix系統中, 每個行程都有其各自的環境變數設定。 預設情況下, 當一個行程被建立時, 除了建立過程中的明確更改外,它繼承了其父行程的絕大部分環境設定。 在API層級上, 使用fork和exec函式進行變數設定。或利用bashshell檔案, 使用特殊的命令呼叫來改變環境變數:通過env 間接替代或者使用ENVIRONMENT_VARIABLE=VALUE <command> 標識. 所有的Unix作業系統 以及DOS 和Microsoft Windows 都是用環境變數,但是它們使用不同的環境變數名稱。我們可以通過執行程式來存取環境變數的值。
用我們聽得懂得話來說就是:有的時候你不得不去修改以使得你的程序正常運行的一個電腦設置.
舉個例子:
- PATH 羅列出 shell 搜尋 用戶 輸入的執行命令所在的目錄。
- HOME (類Unix系統) 和 userprofile (Microsoft Windows) 表示用戶的家目錄在檔案系統中的位置。
- TERM (類Unix系統) 指定使用終端或虛擬終端 的類型 (如, vt100 or dumb)。
- CVS_RSH (類Unix系統) 該選項可用於 ext 方式中指明 cvs 客戶端尋找遠端 shell 的路徑,用作連接 cvs 伺服器和以更高的優先權覆蓋 $CVS_RSH 環境變數中指定的路徑。
- MAIL (類Unix系統) 當前用戶的郵件存放目錄。
2. 設置方法與區別:
既然上面已經談到了設置,不妨先說說環境變量如何設置:
方法一:
- 右鍵我的電腦
- 選擇屬性
- 點擊高級系統設置
- 點擊環境變量
- 修改/添加環境變量
- 保存退出
方法二:
- 快捷鍵: win + Q
- 輸入: environment variables(一般輸入env就會出現)
- 選擇: Edit environment variables for account
- 修改/添加環境變量
- 保存退出
設置對象:
在編輯環境變量的時候我們可以發現電腦中有兩個環境變量,一個是用戶的,一個是系統的,如果你修改用戶中的環境變量,那麼這只能對當前用戶產生影響,如果你修改了系統中的變量,這將會對所有登錄用戶造成影響,同時也只有管理員才能對其進行增刪改.
3. 本質:
在Windows上環境變量的本質是註冊表,而變量的值本質上是字符串.
所以環境變量除了系統產生的,程序生成的,你也可以自己添加你就算添加一個名字為"我",內容是個"帥逼"的環境變量都沒有問題
4. 環境變量包含的內容:
路徑信息,配置文件,動態鏈接庫等可能影響程序運行的各種信息.
但是需要注意:環境變量並不是一定會影響程序運行,這取決於程序對環境變量的使用方式.
5. path變量:
path變量應該是我們最為熟悉的,python,java,winGW等,下面我們說說關於path的事情.
5.1. 影響:
首先是CMD,這個應該是最直接的,因為每次環境變量改變之後我們都需要重啟終端環境變變量才能生效,因為CMD裡面很多命令都是去讀取環境變量,然後與命令一一比對,如果能找到命令則執行,找到不到當然就是我們最熟悉的:'XXXXX' is not recognized as an internal or external command,
operable program or batch file.
然後就是其他一些依賴於環境變量,但是不會每次都去自動刷新環境變量的程序.包括但是不限於:idea,pycharm,vscode等.
舉個例子:假如你的QQ可以依賴環境變量來改變顏色,默認的是藍色.現在你已經啟動QQ,然後你將影響QQ顏色的環境變量改為黑色.但是你發現QQ不會立即改變顏色,但是如果你重啟QQ你就會發現顏色改變了.
至於其中的原因,請查看5.3繼承部分
5.2. 查看方式:
1. 在cmd中查看使用 echo %path%
2. 在python中使用 os.environ['path']
5.3.繼承:
子進程會繼承父進程的環境變量.
這句話很好理解,如果父進程中有環境變量: A, B, C.那麼子進程會在創建的時候拷貝父進程中的環境變量到自己的進程當中.但是不要理解為子進程會讀取父進程環境變量,因為當在子進程中添加一個環境變量D的時候父進程是不會添加的.
現在還是不理解為何修改環環境變量之後需要重啟cmd嗎?仔細回想一下操作系統中的概念: 計算機一共有多少個進程?怎麼樣?想起來了嗎?因為嚴格說來計算機中只有一個(父)進程,其他的所有進程(啟動的程序)都是他的子進程.那麼說這些有什麼用呢?當然有用!
因為啟動的程序就屬於子進程,他們的環境變量是從父進程那你拷貝來的.那麼他的父進程是誰呢?你想想你是怎麼啟動的--桌面點擊!而我們前面也說了系統只有一個進程,但絕對不可能是桌面,所以桌面本身也是一個子進程,叫做"explorer".所以系統每次程序啟動的時候都是從explorer這裡拷貝一份環境變量到自己的進程當中.
可是你還是沒有解釋為何程序需要重啟啊,請往下看:
每一次環境變量的修改都停留在explorer這一層,所以當一個程序啟動的時候explorer會從系統中讀取環境變量并拷貝給通過explorer啟動的(子)程序,而explorer將環境變量拷貝到自己的進程之後也就不受explorer的環境變量改變影響.而環境變量修改之後重啟程序,explorer會將新的環境變量賦值給程序,供其使用