武漢網(wǎng)站建設(shè)公司華企加速器醫(yī)療器械龍頭股
文章目錄
- 1、認(rèn)識(shí)
- 2、通過代碼獲取環(huán)境變量
- 1、手動(dòng)獲取
- 2、函數(shù)獲取
- 3、重新認(rèn)識(shí)環(huán)境變量
1、認(rèn)識(shí)
在云服務(wù)器上寫程序時(shí),最終的執(zhí)行需要./文件名,點(diǎn)表示當(dāng)前目錄,/是文件分隔符,之后就會(huì)打印程序,這是用戶的操作;而系統(tǒng)則不必這樣做,這是因?yàn)橄到y(tǒng)有環(huán)境變量的支持。環(huán)境變量中有個(gè)常見的PATH,查看環(huán)境變量用這個(gè)指令echo $。執(zhí)行就會(huì)出現(xiàn)一個(gè)路徑,也就是PATH的路徑,我們寫的程序由于不在這個(gè)路徑里,自然也就無法自動(dòng)執(zhí)行,所以需要用戶自己指定路徑。而系統(tǒng)命令,比如ls,用which ls查看路徑,發(fā)現(xiàn)它的路徑可以在PATH的路徑里找到,所有調(diào)用ls時(shí)不需要指定路徑。
要在PATH里添加自己的路徑的話,命令:export PATH=$PATH:路徑。這樣可以不改變?cè)新窂蕉砑有侣窂?。?dāng)然也可以用cp -rf 文件名 /usr/bin指令把路徑拷貝過去,也可以在系統(tǒng)目錄里查看到。
實(shí)際上像這樣把可執(zhí)行程序拷貝到系統(tǒng)默認(rèn)路徑下就相當(dāng)于Linux的軟件安裝。而卸載,rm /usr/bin/文件名 -rf,就是刪除路徑。
通過以上例子,可以這樣理解環(huán)境變量:它是由系統(tǒng)維護(hù)的,在特殊場(chǎng)景的變量。環(huán)境變量可以幫助編譯器編譯用戶寫的代碼。
常見的環(huán)境變量:
PATH:指定命令的搜索路徑
HOME:指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時(shí),默認(rèn)的目錄)
SHELL:當(dāng)前Shell,它的值通常是/bin/bash。
想查看某一個(gè)環(huán)境變量的話, echo $環(huán)境變量名 ,查看系統(tǒng)環(huán)境變量的話,env即可。
很多系統(tǒng)展現(xiàn)出來的規(guī)定都是依靠環(huán)境變量去實(shí)現(xià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)境變量
2、通過代碼獲取環(huán)境變量
1、手動(dòng)獲取
int main(int argc, char* argv[], char* envvp[])
{//envp就是環(huán)境變量的指針數(shù)組,每一個(gè)指向一個(gè)字符串,最后一個(gè)指向字符串的指針的下一項(xiàng)會(huì)指向NULLfor(int i = 0; envo[i]; i++){printf("envp[%d]->%s\n", i, envp[i]);}return 0;
}
通過這個(gè)程序打印出來的就是傳遞給當(dāng)前進(jìn)程的環(huán)境變量表。每個(gè)字符串就是環(huán)境變量字符串。
假如不傳參,我們也可以拿到環(huán)境變量。environ是一個(gè)全局變量,char**類型,相當(dāng)于char* []。
int main()
{ extern char** environ;for(int i = 0; environ[i]; i++){printf("environ[%d]->%s\n", i, environ[i]);}return 0;
}
2、函數(shù)獲取
但環(huán)境變量不需要用戶自己去遍歷。使用特定的函數(shù)可以獲取。getenv函數(shù),可根據(jù)變量名獲取變量。這個(gè)需要頭文件<stdlib.h>。
int main()
{char* user = getenv("USER");if(user == NULL) perror("getenv");else printf("USER: %s\n", user);return 0;
}
把user換成pwd,pwd這個(gè)指令也就寫好了,如果把當(dāng)前目錄放到根目錄下,export PATH=$PATH:路徑,那么pwd和自己寫的pwd查看到的都只有一個(gè)/。
如果想讓寫的這個(gè)程序只有自己可以執(zhí)行:
#define NAME "zyd"
int main()
{char* own = getenv("USER");if(strcmp(own, NAME) == 0){printf("程序正常執(zhí)行");}else{printf("當(dāng)前用戶%s非本人,不能運(yùn)行\(zhòng)n", own);}return 0;
}
3、重新認(rèn)識(shí)環(huán)境變量
環(huán)境變量本質(zhì)上是一個(gè)內(nèi)存級(jí)的一張表,這張表由用戶在登陸系統(tǒng)的時(shí)候,進(jìn)行給特定用戶形成屬于自己的環(huán)境變量表。每一個(gè)環(huán)境變量都有自己的應(yīng)用場(chǎng)景。每一個(gè)元素都是kv的。
我們手動(dòng)改環(huán)境變量時(shí),再次運(yùn)用變量會(huì)被改變,而重啟一下就恢復(fù)正常了。環(huán)境變量再?zèng)]有存入數(shù)據(jù)的時(shí)候,它放在系統(tǒng)的配置文件。在根目錄下,ls -al,看到.bash_profile和.bashrc,這兩個(gè)文件就是shell腳本,里面存放配置文件。
環(huán)境變量是在哪里建立的?啟動(dòng)Xshell后,內(nèi)存會(huì)開一個(gè)Xshell進(jìn)程,這個(gè)進(jìn)程會(huì)讀取命令和命令行,并且加載進(jìn)環(huán)境變量這個(gè)表;當(dāng)我們export一行代碼后,比如a=‘!!!’,系統(tǒng)就會(huì)把它讀成一個(gè)字符串"a=‘!!!’",并且由表中空著的指針去指向這個(gè)字符串,再重新設(shè)定NULL, 當(dāng)然空間不夠就擴(kuò)容。而創(chuàng)建子進(jìn)程后,作為父進(jìn)程,環(huán)境變量就會(huì)被傳到子進(jìn)程里。環(huán)境變量是由bash整理的。
在程序文件里,可以寫printf(“myenv: %s\n”, getenv(“a”)); 運(yùn)行成功后,我們就可以看到自己搞的這個(gè)變量。
改環(huán)境變量用export是因?yàn)檫@樣才可以繼承到子進(jìn)程,如果不加export,也可以寫成功,但這將會(huì)是shell的本地變量,只在shell內(nèi)部有效,我們寫一個(gè)程序文件去調(diào)用它無法調(diào)用,這樣的解決辦法就是export 變量名就可,因?yàn)樗呀?jīng)被建立了,這時(shí)候export就是把本地變量添加到表里了。
之后的博客中還會(huì)深入一下環(huán)境變量。但這篇也基本全了。
結(jié)束。