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