欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:初識(shí)Linux · 環(huán)境變量

柚子快報(bào)激活碼778899分享:初識(shí)Linux · 環(huán)境變量

http://yzkb.51969.com/

目錄

前言:

命令行參數(shù)

環(huán)境變量

直接看現(xiàn)象

更多的環(huán)境變量

嘗試?yán)斫猸h(huán)境變量

前言:

今天介紹的是一個(gè)較為陌生的名詞,環(huán)境變量,在學(xué)習(xí)環(huán)境變量之前,我們需要一定的預(yù)備知識(shí),這個(gè)預(yù)備知識(shí)是命令行參數(shù),所以今天我們介紹環(huán)境變量的時(shí)候,介紹順序是先介紹命令行參數(shù),然后直接看有關(guān)環(huán)境變量的現(xiàn)象,到更多的環(huán)境變量,最后我們嘗試來(lái)理解環(huán)境變量。

現(xiàn)在進(jìn)入第一個(gè)話題,預(yù)備知識(shí)——命令行參數(shù)。

命令行參數(shù)

介紹命令行參數(shù)我們從main函數(shù)開(kāi)始,相信不少人是比較疑惑的,這和C語(yǔ)言的main函數(shù)有什么關(guān)系?還真有,只不過(guò)是我們最開(kāi)始忽略了main函數(shù)的參數(shù)而已,相信這個(gè)時(shí)候有人開(kāi)始有反應(yīng)了,main函數(shù)我們學(xué)習(xí)的時(shí)候確實(shí)會(huì)有人帶參數(shù),只是因?yàn)闆](méi)有方法傳參進(jìn)行調(diào)用,也就不了了之了:

5 int main(int argc,char* argv[])

6 {

7

8

9 return 0;

10 }

今天的命令行參數(shù)就從argc argv開(kāi)始。

那么先來(lái)一段代碼:

5 int main(int argc,char* argv[])

6 {

7 for(int i = 0;i < argc;i++)

8 {

9 printf("%s\n",argv[i]);

10 }

11

12 return 0;

13 }

為什么寫(xiě)這樣一段代碼呢?我們不妨對(duì)參數(shù)進(jìn)行一點(diǎn)分析,int argc說(shuō)明argc是一個(gè)整形,后面的argc是一個(gè)char*類型的數(shù)組,就代表說(shuō)這個(gè)數(shù)組的內(nèi)容是char*,那么我們應(yīng)該是可以嘗試進(jìn)行打印的,所以我們寫(xiě)了如下代碼,make一下之后,我們看看結(jié)果是什么:

結(jié)果是我們?cè)诿钚袇?shù)不管輸入多少都會(huì)進(jìn)行打印,并且打印順序默認(rèn)是從左到右,即最開(kāi)始的一定是./test,那么這是為什么呢?

我們?cè)賮?lái)看一段代碼:

6 int g_val = 100;

7 int main()

8 {

9 int a = 1;

11 pid_t id = fork();

12 if(id == 0)

13 {

14 printf("a=%d&&g_val=%d\n",a,g_val);

15 }

16 return 0;

17 }

打印結(jié)果:

這個(gè)打印結(jié)果很簡(jiǎn)單,這里提問(wèn),子進(jìn)程為什么能打印g_val的值呢?

我們都知道全局變量是在main函數(shù)棧幀創(chuàng)建之前就創(chuàng)建了的,按道理來(lái)說(shuō)應(yīng)該是和子進(jìn)程沒(méi)有關(guān)系才對(duì),那么,子進(jìn)程能打印這是怎么回事呢?

這里就得出來(lái)一個(gè)重要結(jié)論,父進(jìn)程的數(shù)據(jù),默認(rèn)能被子進(jìn)程看到并訪問(wèn)!

我們現(xiàn)在有了兩個(gè)預(yù)備知識(shí):

1 main函數(shù)的命令行參數(shù)可以使用,命令行參數(shù)是我們輸入得來(lái)的

那么作用是什么?不要忘記我們ls的不同選項(xiàng)了,是不是就可以結(jié)合命令行參數(shù),類似于通過(guò)下標(biāo)的方式,來(lái)執(zhí)行不同的功能了?這就是命令行參數(shù)要做的事。

2 父進(jìn)程的數(shù)據(jù)默認(rèn)能被子進(jìn)程看到并訪問(wèn)

第三個(gè)知識(shí)是,我們平常輸入指令的地方,也就是命令行解釋器,提問(wèn),我們是輸入給誰(shuí)的呢?為什么我們輸入了對(duì)應(yīng)的指令,就可以有相應(yīng)的指令運(yùn)行呢?

這里,就是命令行解釋器,我們平常輸入的ls cd等命令,輸入了之后,在進(jìn)程部分我們知道它們實(shí)際上也是一個(gè)一個(gè)的進(jìn)程,那么它們的父進(jìn)程是什么?

不管我們寫(xiě)了任何的代碼,不管怎么運(yùn)行,不管我們使用的是任何的指令,不管帶了多少個(gè)選項(xiàng),它們本質(zhì)都是進(jìn)程,我們打印出來(lái)它們的ppid,在ps里面,查對(duì)應(yīng)的ppid,就發(fā)現(xiàn)是bash進(jìn)程。

這個(gè)場(chǎng)景是不是很像VS中cin的時(shí)候,等待輸入?

所以實(shí)際上我們的操作都是對(duì)bash進(jìn)程操作的,雖然我們是運(yùn)行了子進(jìn)程,但是本質(zhì)都是給的bash進(jìn)程。

預(yù)備知識(shí)3:

3 命令行給的指令等,都是傳給bash的

環(huán)境變量

3個(gè)預(yù)備知識(shí)已經(jīng)就位,首先提一個(gè)問(wèn)題,ls運(yùn)行的時(shí)候是進(jìn)程,我們自己寫(xiě)的代碼運(yùn)行的時(shí)候./test也是進(jìn)程,它們兩個(gè)都是子進(jìn)程,憑什么我們自己寫(xiě)的代碼就需要./ ,要在當(dāng)前路徑尋找呢?ls等指令就不需要呢?

直接看現(xiàn)象

我們直接引出結(jié)論,因?yàn)橛蠵ATH這個(gè)環(huán)境變量的存在,我們可以使用echo打印出來(lái)看看:

這樣是不行的,我們需要$符號(hào):

我們可以看到有多個(gè)路徑,以冒號(hào)為分隔符。

而且可以看到,ls的指令是在bin目錄里面,在PATH里面恰好也有,而查找命令就是根據(jù)PATH里面有沒(méi)有對(duì)應(yīng)的路徑,如果沒(méi)有對(duì)應(yīng)的路徑,就需要我們自己指定路徑了。

這是PATH的用途。

這樣更加直觀,我們可以指定路徑,來(lái)執(zhí)行我們所寫(xiě)的代碼。

這是直接看現(xiàn)象部分,Linux中有全局設(shè)置,即是告訴編譯器,應(yīng)該去哪里尋找命令。

那么我們?nèi)绻胍拖到y(tǒng)一樣,直接執(zhí)行呢?也就是說(shuō)我們要修改PATH,或者說(shuō)將可執(zhí)行文件放在PATH里面的目錄里面,我們先來(lái)試試第二種,將我們對(duì)應(yīng)的路徑加進(jìn)去:

使用該指令,將我們的可執(zhí)行文件所在的文件路徑加進(jìn)去即可,然后就可以執(zhí)行運(yùn)行。

這里有一個(gè)需要注意的點(diǎn),test在Linux中是一個(gè)命令,如果我們的可執(zhí)行文件是test的話,就會(huì)導(dǎo)致結(jié)果容易混淆,這里推薦將可執(zhí)行文件換個(gè)名字:

此時(shí)就好了。

這是第二種,我們來(lái)試試第一種,直接修改PATH:

此時(shí)我們直接修改,然后會(huì)發(fā)現(xiàn)PATH的路徑只有我們賦值的,這是一種覆蓋:

但是此時(shí)就會(huì)發(fā)現(xiàn),bin目錄的,或者是說(shuō)原來(lái)的路徑里面的指令都使用不了,但是我們的main還是可以使用:

好了,是不是感覺(jué)麻煩來(lái)了?什么指令都用不了了,此時(shí),有同學(xué)會(huì)注意到為什么echo還可以使用?

這里就先埋個(gè)伏筆,我們通過(guò)這個(gè)現(xiàn)象,引入一個(gè)問(wèn)題,我們打印出來(lái)的Hello world是來(lái)源于內(nèi)存還是磁盤呢?

答案不用多說(shuō),自然是內(nèi)存,那么我們使用指令的時(shí)候,bash進(jìn)程肯定是要先找到指令,那么去哪里找呢?結(jié)合我們打印Hello world,我們知道是先將字符串加載到虛擬地址,也就是到了內(nèi)存里面,同理,bash找指令的時(shí)候,是不是應(yīng)該到虛擬內(nèi)存去找?

當(dāng)我們登錄到Linux系統(tǒng)的時(shí)候,許多配置文件是先加載到了bash進(jìn)程,那么環(huán)境變量是否在配置文件里面呢?當(dāng)然是,所以我們能看到的PATH不過(guò)是內(nèi)存級(jí)的變量,如果我們重啟一下,那么我們對(duì)PATH的修改就沒(méi)有用了,因?yàn)榕渲梦募覀儧](méi)有修改。

那么對(duì)于配置文件和指令,我們可以有一個(gè)結(jié)論,因?yàn)閎ash要執(zhí)行指令的時(shí)候,需要找到該指令,那么配置文件就一定比指令先加載到bash進(jìn)程里面。

既然提到了配置文件,我們不妨看幾個(gè):

對(duì)于vim來(lái)說(shuō),viminfo就是它的配置文件之一,所以我們yum的時(shí)候,是十分方便的,因?yàn)樗鼤?huì)幫我們下載對(duì)應(yīng)的配置文件,我們就不用單獨(dú)配置文件了。

更多的環(huán)境變量

我們現(xiàn)在了解了一個(gè)環(huán)境變量,我們來(lái)看看更多的環(huán)境變量:

因?yàn)閳D片大小原因,這里截圖部分,我們使用指令env即可查出來(lái)一張表,環(huán)境變量表,里面包好了所有的環(huán)境變量,我們每個(gè)簡(jiǎn)單介紹一下:

SHELL變量,外殼程序,可以理解為bash是它實(shí)例化的一個(gè)對(duì)象,HISTSIZE歷史大小,表示該機(jī)器能存儲(chǔ)我們指令的最大個(gè)數(shù),我們平時(shí)使用指令是可以上翻下翻找我們使用過(guò)的指令的,那么查找是有個(gè)度,就是這個(gè)環(huán)境變量,是我們存儲(chǔ)指令的最大數(shù)目,默認(rèn)是1000.

可以使用指令history來(lái)查看我們寫(xiě)過(guò)的指令。HISTTIMEFORMAT歷史時(shí)間格式,PWD代表當(dāng)前路徑,它是可以變化的,因?yàn)槲覀儾还茉谀膫€(gè)路徑下是用pwd都可以打印當(dāng)前路徑,就是因?yàn)樗亲兓?。HOME不用多少,當(dāng)前用戶的家目錄。

帶有UTF的環(huán)境變量是表示當(dāng)前的編碼是什么,比如這臺(tái)機(jī)器的編碼就是UTF-8,下面那個(gè)讓人頭皮發(fā)麻的是顏色設(shè)置。

還有這些,比如PATH,USER等。

以上就是其他的環(huán)境變量。

那么我們能不能自己來(lái)點(diǎn)環(huán)境變量呢?當(dāng)然是可以的:

難道這么簡(jiǎn)單?

這也沒(méi)有找到???

為什么又可以打印呢?

哦~原來(lái)是因?yàn)镠ELLO是個(gè)本地變量,我們只需要知道一下本地變量就可以了,沒(méi)啥用這東西,那么我們?nèi)绾巫孒ELLO變成環(huán)境變量呢?

export即可,如何取消我們?cè)O(shè)置的環(huán)境變量呢?

?unset即可。

嘗試?yán)斫猸h(huán)境變量

我們首先來(lái)看一個(gè)函數(shù),我們想要通過(guò)代碼的形式,來(lái)看到環(huán)境變量,所以我們使用environ,它是一個(gè)二級(jí)指針,不出意外,指向的是一個(gè)char*的數(shù)組,那么我們打印看看:

int main()

{

extern char** environ;

for(int i = 0;environ[i];i++)

{

printf("env[%d]:%s\n",i,environ[i]);

}

return 0;

}

欸!這個(gè)東西,怎么那么,像我們剛才看到的環(huán)境變量?對(duì)!它們就是我們剛才看到的環(huán)境變量。

那么結(jié)合我們的預(yù)備知識(shí)2,父進(jìn)程的數(shù)據(jù)可以被子進(jìn)程看到,我們知道最開(kāi)始加載到了bash進(jìn)程環(huán)境變量,可以被子進(jìn)程打印出來(lái),那么在bash里面是如何對(duì)諸多環(huán)境變量進(jìn)行管理的呢?

這里的environ是二級(jí)指針的數(shù)組,供子進(jìn)程使用,我們不難猜測(cè),bash進(jìn)程組織環(huán)境變量是靠的一張表,char* env里面存儲(chǔ)的就是所有的環(huán)境變量,而environ指向的就是env數(shù)組,那么就可以通過(guò)下標(biāo)的方式進(jìn)行打印。

既然數(shù)據(jù)都共享了,父進(jìn)程不妨直接給子進(jìn)程兩張表,一張表是命令行參數(shù)表,一張表是環(huán)境變量表。

此時(shí),我們?cè)诿钚薪忉屍鬏斎氲?a使用到了命令行參數(shù)表,環(huán)境變量表我們可以這樣:

int main(int argc,char* argv[],char* env[])

{

for(int i = 0;env[i];i++)

{

printf("%s\n",env[i]);

}

return 0;

}

所以引入了main函數(shù)的第三個(gè)參數(shù),env環(huán)境參數(shù)表,這里使用env[i]作為判斷條件,我們還可以證明一件事,argv[] env[]都是以NULL結(jié)尾的。

看一個(gè)庫(kù)里面的函數(shù),叫做getenv,簡(jiǎn)單的,我們直接實(shí)例代碼即可:

int main(int argc,char* argv[],char* env[])

{

char* str = getenv("PATH");

if(str)

{

printf("%s\n",str);

}

return 0;

}

簡(jiǎn)而言之,getenv就是用來(lái)查找環(huán)境變量的。

所以現(xiàn)在查找環(huán)境變量有三種方式,一種是getenv,一種是main函數(shù)的參數(shù),一種是environ二級(jí)指針。

我們現(xiàn)在進(jìn)入最后一個(gè)話題,為什么我們最開(kāi)始修改了PATH,但是仍然可以執(zhí)行echo命令呢?

我們?nèi)绻鹐xport一個(gè)環(huán)境變量,env里面可以查找到:

但是我們結(jié)合父進(jìn)程的數(shù)據(jù)能被子進(jìn)程看到,但是子進(jìn)程的數(shù)據(jù)不應(yīng)該被父進(jìn)程看到這個(gè)點(diǎn),難道bash執(zhí)行export不會(huì)創(chuàng)建子進(jìn)程嗎?

是的,如果創(chuàng)建了子進(jìn)程,bash的env表就是不能看到HELLO,所以這種指令是特殊指令,叫做內(nèi)建命令,是由bash自己來(lái)執(zhí)行的,不是創(chuàng)建了子進(jìn)程的。

到此,環(huán)境變量就結(jié)束了!尚未不清楚的點(diǎn)后續(xù)更新~

感謝閱讀!

柚子快報(bào)激活碼778899分享:初識(shí)Linux · 環(huán)境變量

http://yzkb.51969.com/

相關(guān)閱讀

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19474351.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄