柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Linux:環(huán)境變量
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Linux:環(huán)境變量
一、環(huán)境變量
1.1 PATH的引入
問題1:為什么我們平時(shí)輸入的指令可以直接運(yùn)行,但是自己編譯出來的程序卻要加 ./?
——>因?yàn)橹噶钏枰南嚓P(guān)程序是存儲(chǔ)在系統(tǒng)能夠查找得到的底下,而我們自己編譯出來的程序是在當(dāng)前的工作目錄的,系統(tǒng)并不能直接找到。
問題2:憑什么系統(tǒng)可以找到指令的程序卻找不到自己的程序呢??
——> 因?yàn)榄h(huán)境變量PATH,他是Linux系統(tǒng)指令搜索路徑,用echo? $PATH(需要加)可查看系統(tǒng)能夠找到的路徑 ,其中路徑以 “ :”為分隔符? (比如pwd能直接使用就是因?yàn)?usr/bin路徑在PATH變量中)
?如果我們用自己編譯的程序,就會(huì)顯示command not found ,意思就是xshell幫我們找過了,只是他找不到而已
?問題3:如果我想讓自己寫的程序像指令一樣去使用,有什么辦法呢???
——>(1)思路1:比如/usr/bin路徑在PATH變量里,那我們就把自己寫的程序放到該路徑下即可
(2)思路2:我當(dāng)前的程序無法使用時(shí)因?yàn)槲业墓ぷ髂夸洸辉谙到y(tǒng)的指令搜索路徑內(nèi),所以我們把當(dāng)前的工作目錄加入到PATH中就行了?。?/p>
?問題4:如何修改環(huán)境變量
——> (1)PATH=……? ?但是這樣的意思是賦值,也就是說原先的內(nèi)容會(huì)被覆蓋掉,這樣會(huì)導(dǎo)致我們絕大多數(shù)指令跑不了(有一部分指令是內(nèi)建命令,不會(huì)被影響)? ? 但是我們只要重新啟動(dòng)xsell就會(huì)恢復(fù),因?yàn)槲覀兊腜ATH是一個(gè)內(nèi)存級(jí)文件,他是在我們xshell打開之后加載進(jìn)去的??!
(2)PATH=$PATH:……? ?這樣的意思就是在原有路徑的基礎(chǔ)上新增路徑
1.2 HOME和SHELL?
HOME會(huì)在我們xshell登錄的時(shí)候自動(dòng)識(shí)別用戶,然后將根目錄載入進(jìn)去
SHELL?里面的是我們當(dāng)前的xshell所使用的可執(zhí)行程序
1.3?查看所有環(huán)境變量的方法
1.3.1 命令行形式
env——>查看所有的環(huán)境變量
1.3.2 系統(tǒng)調(diào)用接口
getenv()
1.3.3 第三方變量獲取
extern char **environ
??????
1.3.4?如何通過系統(tǒng)調(diào)用接口來判斷權(quán)限
? ? ? ?通過getenv我們可以知道,只要我們將我們想要查找的環(huán)境變量放在參數(shù)里,就可以以字符串的形式返回 ,? ?所以我們可以用strcmp()這個(gè)字符串比較函數(shù),我們的 USER和root一樣,那么就是超級(jí)用戶,其他情況就是普通用戶。
? ? ? 所以因?yàn)橛辛谁h(huán)境變量,系統(tǒng)就可以知道你是誰,就可以和文件的擁有者、所屬組、其他人的權(quán)限進(jìn)行比較,就可以知道你是否具備對(duì)應(yīng)的權(quán)限??!? ??
1.4 命令行參數(shù)
1.4.1 選項(xiàng)的兩個(gè)參數(shù)
其實(shí)我們的main函數(shù)是可以帶參數(shù)的,因?yàn)樗鋵?shí)也是被別人調(diào)用的一個(gè)函數(shù)
int argc:向量表中命令行參數(shù)的個(gè)數(shù)
char* argv[ ]: 其實(shí)是一個(gè)向量表,里面存儲(chǔ)著命令行參數(shù) (最后的位置為nullptr)
我們可以看到向量表的第一個(gè)位置一定是這個(gè)指令,而后面的位置存放一些附加的選項(xiàng)
? ? ? ? 這樣做的原因是為指令、工具、軟件等提供命令行選項(xiàng)的支持,幾乎所有的語言都需要命令行參數(shù),因?yàn)檫@樣能夠?yàn)槲覀兊囊恍┻x項(xiàng)定制特殊化的功能
1.4.2 系統(tǒng)調(diào)用接口模擬實(shí)現(xiàn)定制化選項(xiàng)
? ? ? ? 先暫時(shí)不考慮多個(gè)選項(xiàng)的情況,因?yàn)檫@個(gè)會(huì)涉及到可變參數(shù)的知識(shí) ,所以我們先假設(shè)只能攜帶一個(gè)選項(xiàng),而由于向量表的第一個(gè)位置必然是./mycode 因此第二個(gè)位置就是我們攜帶的選項(xiàng),因?yàn)檫x項(xiàng)是字符串的形式,因此我們就可以通過strcmp函數(shù)通過條件編譯,來實(shí)現(xiàn)不同的選項(xiàng)實(shí)現(xiàn)不同的功能??!
? ? ?所以另一方面我們可以知道,main函數(shù)是如何知道自己有多少個(gè)參數(shù)呢??其實(shí)本質(zhì)上來說就是main函數(shù)也是被別人調(diào)用的,所以他在調(diào)用的時(shí)候就會(huì)在底層進(jìn)行相關(guān)的條件編譯(也就是對(duì)你的參數(shù)做檢查),不同的參數(shù)就走不同的方向
1.4.3?環(huán)境變量相關(guān)的參數(shù)
其實(shí)還有一個(gè)參數(shù)? char* env[ ]——>存儲(chǔ)環(huán)境變量向量表
?因此我們可以知道了兩張重要的向量表:(1)命令行參數(shù)表 (2)環(huán)境變量表
?1.4.4 理解環(huán)境變量的全局屬性
? ? ? ?環(huán)境變量是系統(tǒng)提供的一組name=value形式的變量,不同的環(huán)境變量有不同的用戶,通常具有全局屬性
? ? ? 如何理解全局屬性,其實(shí)本質(zhì)上就是由于環(huán)境變量表,我們所執(zhí)行的進(jìn)程都是子進(jìn)程,bash本身在啟動(dòng)的時(shí)候,會(huì)從操作系統(tǒng)的配置文件中讀取環(huán)境變量信息,然后子進(jìn)程會(huì)繼承父進(jìn)程的環(huán)境變量??!?因此環(huán)境變量表會(huì)被繼承下去??!就相當(dāng)于是全局了?。?/p>
? ? ? 根據(jù)前面的知識(shí)。如果是先創(chuàng)建了進(jìn)程,然后再修改了環(huán)境變量,那么新創(chuàng)建的子進(jìn)程必然會(huì)被繼承下去(共享數(shù)據(jù)),但如果創(chuàng)建了子進(jìn)程然后修改了環(huán)境變量并不會(huì)影響父進(jìn)程的環(huán)境變量,因?yàn)闀?huì)發(fā)生寫時(shí)拷貝
1.4.5 本地變量vs環(huán)境變量
本地變量只會(huì)在bash內(nèi)部有效,不會(huì)被繼承
set ——>查看所有的環(huán)境變量的本地變量
export ……——>將本地變量變成環(huán)境變量
unset……——>清除環(huán)境變量
什么情況下需要本地變量呢??
——>就是只希望在bash里面使用但是不希望被子進(jìn)程繼承下去的,比如說我們的命令行提示符,如果是root用戶就是# 如果是普通用戶就是$?
1.4.6 常規(guī)命令vs內(nèi)建命令?
? ? ? ?之前我們提到過,如果我們不小心將環(huán)境變量覆蓋了,那么就會(huì)導(dǎo)致大部分的指令用不了,但是并不是所有的指令都用不了??! 比如echo、pwd、cd…… 因?yàn)樗麄兪莾?nèi)建命令
常規(guī)命令:通過創(chuàng)建子進(jìn)程完成的
內(nèi)建命令:bash不創(chuàng)建子進(jìn)程,而是由自己親自執(zhí)行,類似與bash調(diào)用了自己一些的,或者是系統(tǒng)提供的函數(shù)?
?所以一般的命令,我們可以知道bash應(yīng)該是使用了fork函數(shù)創(chuàng)建了子進(jìn)程去完成的,但是內(nèi)建命令就是直接去完成
1.4.7 模擬實(shí)現(xiàn)內(nèi)建命令cd
chdir
1.5? 再次總結(jié)環(huán)境變量
? ? 環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù),通常具有全局屬性,并且一般來講都有其特殊的用途(比如我們在編寫C/C++代碼的時(shí)候,在鏈接的時(shí)候,從來不知道我們的所鏈接的動(dòng)態(tài)靜態(tài)庫在哪里,但 是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找。)
環(huán)境變量相關(guān)命令:
1、echo: 顯示某個(gè)環(huán)境變量值
2. export: 設(shè)置一個(gè)新的環(huán)境變量
3. env: 顯示所有環(huán)境變量
4. unset: 清除環(huán)境變量
5. set: 顯示本地定義的shell變量和環(huán)境變量
?環(huán)境變量的組織方式:每個(gè)程序都會(huì)收到一張環(huán)境表,環(huán)境表是一個(gè)字符指針數(shù)組,每個(gè)指針指向一個(gè)以’\0’結(jié)尾的環(huán)境字符串? ? ??
?
柚子快報(bào)邀請(qǐng)碼778899分享:運(yùn)維 Linux:環(huán)境變量
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。