首頁 > 系統教程 > Linux > 主體

Linux環境變數來自哪些檔案?

王林
發布: 2024-03-20 19:50:10
轉載
605 人瀏覽過

Linux環境

在LinuxShell登陸成功之後,Linux會從檔案中取得一系列的資料為該次登陸所用,這種資料會在個別指令或個別程式中被使用。那些資料就稱為LinuxShell運行時的環境。環境中的資料可以大致分為四種:環境變量,Shell變量,別稱(alias),Shell函數。其中Shell變量,別稱,Shell函數在此不做詳盡說明。

環境變數裡有哪些?

可以直接用無參數的printenv指令來輸出目前session的環境變數以及環境變數的值。若加上參數,則是輸出某個變數的值。倘若更方便地查看,可以將printenv的輸出傳給less來查看環境變數(1):

printenv | less
登入後複製

下邊是在我的Linux系統上的部份輸出結果:

...
……
MANDATORY_PATH=/usr/share/gconf/cinnamon.mandatory.path
XDG_SESSION_ID=c2
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/rit
USER=rit
DESKTOP_SESSION=cinnamon
QT4_IM_MODULE=fcitx
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/e9e1def3_9380_43b6_8ce3_7916861e45d2
DEFAULTS_PATH=/usr/share/gconf/cinnamon.default.path
QT_QPA_PLATFORMTHEME=qt5ct
PWD=/home/rit
HOME=/home/rit
……
...
登入後複製

可以看見,平常接觸到的PWD,HOME,USER等都在其中。

假如要在指令的參數中使用某個變數的值,可以輸入"$變數名"(2)。諸如:

ls $HOME/bin
登入後複製

用戶自訂變數

不僅系統自帶的變量,使用者還可以自訂變數:

rit@rit-X405UA:~$ foo=FOO
rit@rit-X405UA:~$ hello='Hello World'
rit@rit-X405UA:~$ echo $foo
FOO
rit@rit-X405UA:~$ echo $hello
Hello World
登入後複製

注意到等號左右兩側不留空格,由於空格在shell指令上面被視為分隔符,並不是無意義的符號。

注意到假如出現特殊字元紅帽linux系統下載,如空格,$,等等,要用冒號擴充(3)。

假如要讓接出來在該shell運行的程式才能存取到該變量,則要使用export指令:

rit@rit-X405UA:~$ export foo hello
登入後複製

#像這樣在目前的session中定義的變數只在目前session有效,即退出再登陸這個變數就不存在了。若要在每次登錄到shell的時侯都能使用到該變量,需將該變量定義到環境變量的設定檔中。

環境變數來自什麼檔案?

如文章開頭所述,Linux會從檔案中取得環境變數。這麼是什麼檔案在提供LinuxShell環境變數呢? (前面再解釋loginshell與non-loginshell)

linux修改环境变量的值_linux修改用户环境变量_修改环境变量linux

#對於loginshell:

/etc/profile,這個檔案是loginshell的全域環境變數設定文件,全域表示對所有使用者都有效~/.bash_profile,~/.bash_login,~/.profile,這三個檔案用來設定用戶個人的環境變量,所以每位使用者的HOME目錄下就會有起碼這三個檔案中的一個(取決於linux的發行版本)linux修改使用者環境變數,讀取時只會讀取其中一個。 loginshell登陸時linux會先讀取/etc/profile這個全域設定檔linux記憶體管理,再在HOME目錄依照一定順序找這三個文件,最後會讀取找到的第一個檔案。若與/etc/profile中定義的變數有衝突,則會覆寫該變數。

對於non-loginshell:

/etc/bash.bashrc,這個檔案是non-loginshell的全域環境變數設定檔。 (在網路上一些部落格的介紹中,這個檔案不是/etc/bash.bashrc而是/etc/bashrc,其實這取決於發行版本)~/.bashrc,這個檔案是使用者個人的non-loginshell環境變數設定文件,與loginshell相同,該檔案在/etc/bash.bashrc後執行,有衝突時,該檔案也會將衝突的變數重畫。

以上關於檔案讀取次序的描述參考於這篇文章。

各類linux發行版都附有一個指令su,若直接"su用戶名",則會以non-loginshell登陸到該用戶,若加上選項"-"或是"-l"或是" --login",則會以loginshell登陸到該使用者。諸位讀者倘若更清楚的體會這種文件的讀取過程,可以藉助這個命令,透過更改那些文件來進行測試。

loginshell與non-loginshell

#登陸LinuxShell有兩種方式:loginshell與non-loginshell。 loginshell一般會作為第一個登陸的shell(例如開機時的登陸),而non-loginshell一般是開機後從GUI直接啟動的shell。透過這兩種方式登陸的環境變數會有一些差異。

1.non-loginshell會承繼上一個行程(一般是loginshell)中的一些環境變數

可以透過一個簡單測試來驗證。

首先,在目前shell中自定一個變數foo=FOO,並且export(為了讓子程序也能使用這個變量,而shell本身就是一個程式):

rit@rit-X405UA:~$ foo=FOO
rit@rit-X405UA:~$ export foo
登入後複製

接著,以loginshell登陸到另一個帳戶bob,並嘗試查看foo變數:

rit@rit-X405UA:~$ su - bob
Password:
bob@rit-X405UA:~$ echo $foo
bob@rit-X405UA:~$
登入後複製

#結果foo變數為空,在這裡說明foo未被定義。

接著,以non-loginshell登陸到另一個帳戶bob,並查看foo變數:

rit@rit-X405UA:~$ su bob
Password:
bob@rit-X405UA:/home/rit$ echo $foo
FOO
登入後複製

結果foo變數與rit這個使用者的shell中的定義一致。

linux修改用户环境变量_修改环境变量linux_linux修改环境变量的值

#說明non-loginshell承繼了上一個行程的使用者自定變量,而loginshell沒有承繼。

2.PWD,HOME,USER,PATH

在1中的事例就可以注意到,loginshell的PWD弄成了目前使用者的HOME目錄(~),而non-loginshell則承繼了父行程的工作目錄。

若使用echo來查看HOME與USER,我們會發覺兩種登陸形式登陸以後這兩個變數都切換到了當前使用者對應的home目錄與username。

對於兩種登陸形式的PATH的區別,可以在~/.bash_profile(或是~/.bash_login,~/.profile)中找到部線索。上面說過,這三個檔案是在loginshell中讀取的,假如我們仔細比對它們與~/.bashrc,都會發覺~/.bash_profie中多瞭如此兩行:

...
PATH="$HOME/bin:$PATH"
……
PATH="$HOME/.local/bin:$PATH"
...
登入後複製

所以在用兩種方法登陸以後,用echo查看PATH變數可以看見差異如下:

non-loginshell:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
登入後複製

linux修改环境变量的值_linux修改用户环境变量_修改环境变量linux

#loginshell:

/home/rit/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr /local/games:/snap/bin
登入後複製

上面不包含$HOME/bin是由於home目錄沒有這個資料夾。

仔細觀察可以發覺還有別的差別,但這些差別的出處就不太好找了。

註解

(1)linuxshell提供一個叫做pipeline的特點,意味著可以將一個指令的輸出重新導向到下一個指令的輸入(即把某個指令的輸入當成時另一個指令的輸入),不過前提是該指令要才能接受輸入或形成輸出。常見的指令有cat,less,grep等。輸入輸出用"|"來拼接。 ###

(2)linuxshell在讀取到$這個符號時,會先將它前面緊挨到的的字元視為變數名,並將$與變數名替換成變數的值,之後再將取代後的參數傳給命令。這屬於shell的特點expansion中的parameterexpansion,不僅parameterexpansion之外,還有pathnameexpansion,braceexpansion,commandsubstitution。

(3)與(2)相反,假如要忽略掉特殊符號,可以在右邊加破折號。雙冒號會屏蔽除"","`","$"以外的所有特殊符號。單冒號會忽略掉所有特殊符號。

參考

不僅環境變數檔案讀取順序是參考網站的部落格linux修改使用者環境變數,其它內容皆參考自書本:TheLinuxCommandLine2ndEdititonACompleteIntroduction。

勘誤校準2019年7月4日:(1)自訂變數時等號左右兩側都不能留空格。更改前我只提及了等號右邊不能留空格。 (2)parameterexpansion會將"$變數名"替換成變數的值。更改前的描述為把"$變數名"轉換為變數名。 (3)escapecharacter不屬於expansion特點。更改前我把它歸類到了expansion裡。新增內容2019年7月4日:在「使用者自訂變數」部分的結尾新增自訂變數作用範圍的描述。

以上是Linux環境變數來自哪些檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:itcool.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!