Linux環境變數來自哪些檔案?
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)
#對於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中的定義一致。
#說明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
#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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

VS Code 終端命令無法使用的原因及解決辦法:未安裝必要的工具(Windows:WSL;macOS:Xcode 命令行工具)路徑配置錯誤(添加可執行文件到 PATH 環境變量中)權限問題(以管理員身份運行 VS Code)防火牆或代理限制(檢查設置,解除限制)終端設置不正確(啟用使用外部終端)VS Code 安裝損壞(重新安裝或更新)終端配置不兼容(嘗試不同的終端類型或命令)特定環境變量缺失(設置必要的環境變量)
