linux 環境變量歸類和配置

linux 環境變量歸類和配置

linux系統環境分類

在linux操作新系統中,環境變量概括分爲兩種:系統環境變量,shell環境; 也許這裏把環境變量該叫成環境應該更好些,系統環境,shell環境;而環境變量則是將變量存放在系統環境或shell環境中的變量的簡稱;

系統啓動過程中將會加載/etc/profile這個配置文件(如果你的文件系統中有這個文件),這個文件可以配置環境變量,且發生在用戶登錄之前,這樣以來不管任何用戶登錄,都能夠拿到從這個文件中定義的環境變量,這裏我把該操作稱之爲將變量添加如系統環境中;
系統加載完成相關配置文件之後,最後一步一定是運行login等待用戶登錄;系統停在login:username這一步;這裏系統就要停下來等用戶來輸入用戶認證來登入了;當我們使用本地用戶登入了系統,系統將會從/etc/passwd文件中讀取該用戶口令認證是否正確,如果正確將會啓一個該用戶的shell解析終端;當該用戶shell解析終端啓動過程中將會從固定位置(用戶家目錄)中讀取該用戶shell配置文件;
用戶shell配置文件:
~/.bash_profile :用戶第一次登陸將會加載,一般用戶登錄修改該文件之後,需要註銷,重新登陸之後,配置纔會生效;
~/.bashrc:用戶啓動一個shell終端將會執行一次;

當shell終端啓動之後,這時候的環境從系統環境轉被稱爲shell環境;shell環境將會繼承系統環境中的變量,之後該shell中同樣能夠訪問系統環境中的變量;

linux 環境變量配置

用戶想要交互到環境變量,想必是登入到系統中,這時候用戶拿到的環境就是shell環境,該環境是唯一的,且伴隨着用戶本次登陸的一切操作,直到用戶登出,該shell資源纔會被回收;我們可以使用set來看看當前環境中的變量有哪些,同時我們也可以新建一些環境變量;在當前shell終端中執行:name=word格式指令,將會創建一個名叫name的變量,值爲word;將這個變量放在shell環境中;之後我們可以通過echo $name來查看這個變量值;
當然,在用戶的操作過程中,我們所使用的shell不一定只有我們看到的這一個shell終端(爲了方便我們把這個shell叫做父shell),他同樣可以有孩子,也就是子shell;這裏就需要說到shell腳本;

一個shell腳本可以是這個樣子:
這個是一個簡單的shell腳本格式,聲明瞭一個變量叫做__DEBUG他的值爲20;我們在父shell中爲這個腳本加上可執行權限,然後./執行這個腳本;如我們所願屏幕上打印出來了__DEBUG的值20;之後我們在父shell中通過echo $__DEBUG再一次訪問這個變量,但是奇怪的是,結果告訴我們這個變量在當前環境中是空;這裏請不要感覺到很奇怪,也不要懷疑其他的什麼;我想請你看一看這個腳本的第一行#!/bin/bash;
#!/bin/bash:用來告訴我要使用的是什麼解析器;爲什麼要告訴我使用什麼解析器呢?我自己不是有一個shell解析器嗎?奇怪啊;
這裏爲什麼要多此一舉的添加上這個一句話呢?原因是使用./run.sh腳本時;shell解析器將會看看這個文件是不是可執行的,他是一個什麼可執行文件,等一系列判斷操作,這裏也就說明了#!/bin/bash這句話是有用的;決定父shell將會使用一個什麼樣的shell來解析這個腳本;父shell判斷完成之後,將會重新啓一個進程執行bash run.sh這個腳本;重新啓一個進程那麼自然而然的可以說,這個創建的進程是父shell的子進程,從shell的角度來說也就是子shell;這個子進程(子shell)將會繼承父shell的所有環境變量,同樣子進程(子shell)中修改了一些東西,父shell是看不見的,畢竟兩個進程的資源空間都不在一起嘛;
如果我上面那段話你不嫌我囉嗦,那麼你應該已經明白我的意思了;這個腳本中所創建的變量是放在子shell環境中,而子shell聲明週期是該腳本運行到該腳本結束;從始至終,子shell都沒有辦法影響到父shell的環境空間;所以在最後我們查看這個變量時,沒有找到這個變量;原因就是這樣;

如果我們想在腳本中把變量放在父shell環境中,而非重新創建一個shell環境空間;這裏有一個獨特的指令source;
在父shell中執行source run.sh,將會發現變量現在存到了父shell環境中;而非子shell了;

最後:至於想使用什麼樣的方式來用環境變量藏點東西,就要看實際使用情況了;寫點東西,如有誤筆,歡迎指出;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章