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中文網其他相關文章!

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

Linux的缺點包括用戶體驗、軟件兼容性、硬件支持和學習曲線。 1.用戶體驗不如Windows或macOS友好,依賴命令行界面。 2.軟件兼容性不如其他系統,缺乏許多商業軟件的原生版本。 3.硬件支持不如Windows全面,可能需要手動編譯驅動程序。 4.學習曲線較陡峭,掌握命令行操作需要時間和耐心。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。