淺談Linux環(huán)境變量與系統(tǒng)編程
1、基本概念:
環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù)。
系統(tǒng)環(huán)境變量有多種多樣,比如:
- PATH:指定可執(zhí)行程序的搜索路徑(命令也屬于程序)
- LD_LIBRARY_PATH:指定動(dòng)態(tài)庫的搜索路徑
舉個(gè)簡單的例子:
我們查看PATH這個(gè)變量,可以發(fā)現(xiàn)該目錄下有許多路徑(每個(gè)路徑用冒號(hào)(:)分隔),其中包括shell命令目錄。若果我們將/bin這個(gè)路徑從PATH中刪除掉,那么ls就不能直接使用了,而必須在命令行下輸入:/bin/ls,所以為了方便,將shell命令這種可執(zhí)行文件的路徑加入到PATH變量中來,就可以實(shí)現(xiàn)不帶路徑執(zhí)行。那么帶路徑也是同樣的效果,如下所示(雖然我們?cè)诟夸浵拢且琅f可執(zhí)行/bin目錄下的ls,就是因?yàn)镻ATH中存在/bin默認(rèn)路徑):
2、環(huán)境變量的操作:
(1)、對(duì)于環(huán)境變量的基本操作命令如下:
echo //顯示某個(gè)環(huán)境變量值 export //設(shè)置一個(gè)新的環(huán)境變量 env //顯示所有環(huán)境變量 set //顯示本地定義的shell變量 unset //清除環(huán)境變量 readonly //設(shè)置只讀環(huán)境變量
echo我們?cè)谏厦嬗眠^了,而export則是為一個(gè)環(huán)境變量修改新的內(nèi)容,我們經(jīng)常在動(dòng)態(tài)庫制作時(shí)會(huì)這樣寫:export LD_LIBRARY_PATH=.
,就是將當(dāng)前路徑設(shè)置為動(dòng)態(tài)庫的搜索路徑的環(huán)境變量中。注意:export只能在當(dāng)前shell下生效,登出重新啟動(dòng)shell就失效了。
舉例如下:
當(dāng)我們編寫一個(gè)“Hello PATH!”的打印程序時(shí),編譯完成,在運(yùn)行時(shí)需要加上./path_test,而不是直接像ls那樣不帶路徑運(yùn)行path_test,因?yàn)楫?dāng)前目錄不在PATH中,而當(dāng)我們將當(dāng)前目錄加到PATH變量中export PATH=.
時(shí)再運(yùn)行path_test就可以執(zhí)行了。
但是當(dāng)我們CTRL+D退出,再重新登錄時(shí),修改已經(jīng)不再生效了,如下:
并且,export有個(gè)缺點(diǎn):export為修改,而不是增加。它會(huì)將原有的路徑完全刪除,使得當(dāng)前shell下不能使用基本命令,如下:
(2)、如何使得修改長期有效,并且不會(huì)覆蓋原有路徑?
方法如下(修改配置文件.bashrc):
①回到當(dāng)前用戶家目錄/*cd或者cd ~都可以*/
②ls -a/*顯示所有文件,.bashrc為隱藏文件*/
③vim .bashrc/*編輯.bashrc,在文件最后加上一行"export PATH=$PATH:.",保存退出*/
④重啟shell后生效
注意:“export PATH=$PATH:.”千萬不能寫錯(cuò),寫錯(cuò)有可能導(dǎo)致基本的ls等命令不能使用,而且你的vim、vi都不能使用(其實(shí)是可以用的,下面再說)!!但是,只有出錯(cuò),才會(huì)使得記憶更加深刻,在我第一次修改時(shí),我就寫錯(cuò)了(←_←)。那怎樣解決呢?
方法一:重新設(shè)置PATH
PATH=/bin:/usr/bin /*vim在/usr/bin下,而vi在/bin下*/ cd vim .bashrc /*修改.bashrc文件即可*/
方法二:
既然明白方法一,那么方法二就自然而然容易明白了:
操作如下:
cd /usr/bin/vim .bashrc/*或者/bin/vi .bashrc*/ 修改.bashrc文件即可
3、環(huán)境變量與環(huán)境表:
所有的環(huán)境變量在程序中通過環(huán)境表獲??;環(huán)境表是一個(gè)全局變量,類型為字符串?dāng)?shù)組指針(二級(jí)指針),以NULL結(jié)束,獲取方式為:
extern char ** environ;//envioron存儲(chǔ)環(huán)境表的首地址
舉例說明:
/*在主函數(shù)中通過extern char ** environ;來獲取環(huán)境表的首地址,由于環(huán)境表是一個(gè)指針數(shù)組,所以可以通過每個(gè)環(huán)境變量的首地址(數(shù)組的每個(gè)人元素)遍歷該變量內(nèi)容*/ # include<stdio.h> # include<string.h> int main(void) { extern char ** environ; char ** p = environ; while(*p){ printf("%s\n",*p); p++; } return 0; }
那么如何取得某一個(gè)特定的環(huán)境變量,如PATH呢?
# include<stdio.h> # include<string.h> int main(void) { extern char ** environ; char ** p = environ; while(*p){ if(strncmp(*p,"PATH=",5) == 0){/*環(huán)境變量的格式是:變量名=具體內(nèi)容*/ printf("%s\n",*p); break; } p++; } }
我們還有一種方式來獲取環(huán)境表:
#include<stdio.h> #include<stdlib.h> /*第三個(gè)參數(shù)就是環(huán)境表的首地址*/ int main(int argc, char ** argv, char ** env) { /*兩種方法基本相同,只不過char ** env這種方法只能在main函數(shù)中使用;而extern char ** environ這種方法可以再任何一個(gè)函數(shù)中使用*/ extern char ** environ; printf("env=%p\nenviron=%p\n",env,environ);/*輸出結(jié)果顯示,兩個(gè)首地址為同一個(gè)地址,即都是環(huán)境表首地址*/ return 0; }
這幾個(gè)程序就不測試了,編譯運(yùn)行即可觀察
4、如何用函數(shù)來對(duì)環(huán)境變量修改?
函數(shù)如下:
#include<stdlib.h> char * getenv(const char * name); /*返回值為獲取的環(huán)境變量首地址,name為需要匹配的字符串,只會(huì)去除“name=”的內(nèi)容*/ int putenv(char * string); /*string為創(chuàng)建的名字及內(nèi)容創(chuàng)建環(huán)境變量,存在就替換*/ int setenv(const char * name,const char *value,int overwrite); /*設(shè)置一個(gè)環(huán)境變量,第一個(gè)參數(shù)是變量名,第二個(gè)是變量值(內(nèi)容),第三個(gè)參數(shù),新建或替換覆蓋(overwrite為0,不替換;非零替換)*/ int unsetenv(const char * name);/*取消設(shè)置*/ int clearenv(void);/*清空*/
基本測試:
#include<stdio.h> #include<stdlib.h> int main(void) { extern char ** environ; char * path_value = getenv("PATH");/*獲取PATH的內(nèi)容,返回值為PATH字符串的首地址,也就是環(huán)境表數(shù)組中的PATH這個(gè)元素的首地址*/ printf("PATH=%s\n",path_value); /*創(chuàng)建一個(gè)自定義環(huán)境變量*/ putenv("KANGRUOJIN=123456789");/*等號(hào)左邊是變量名,等號(hào)右邊是內(nèi)容(變量值),二者與等號(hào)共同組成這個(gè)字符串參數(shù)*/ printf("KANGRUOJIN=%s\n",getenv("KANGRUOJIN")); putenv("KANGRUOJIN=987654321");/*覆蓋原有內(nèi)容*/ printf("KANGRUOJIN=%s\n",getenv("KANGRUOJIN")); setenv("KANGRUOJIN","ABCDEFG",0);/*ovwrite為0不會(huì)覆蓋*/ printf("KANGRUOJIN=%s\n",getenv("KANGRUOJIN")); setenv("KANGRUOJIN","GFEDCBA",1);/*ovwrite為1會(huì)覆蓋*/ printf("KANGRUOJIN=%s\n",getenv("KANGRUOJIN")); return 0; }
結(jié)果如下:
到此這篇關(guān)于淺談Linux環(huán)境變量與系統(tǒng)編程的文章就介紹到這了,更多相關(guān)Linux環(huán)境變量與系統(tǒng)編程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Linux系統(tǒng)設(shè)置PATH環(huán)境變量(3種方法)
- Linux Shell腳本系列教程(三):變量和環(huán)境變量
- linux下配置jdk環(huán)境變量的三種方法總結(jié)
- Linux Shell腳本系列教程(四):使用函數(shù)添加環(huán)境變量
- 判斷Linux Shell環(huán)境變量是否存在
- Linux下環(huán)境變量配置方法小結(jié)(.bash_profile和.bashrc的區(qū)別)
- Linux環(huán)境變量配置的完整攻略
- 淺析linux環(huán)境變量export命令詳解
- 淺談Linux下修改/設(shè)置環(huán)境變量JAVA_HOME的方法
- Linux中修改環(huán)境變量及生效方法
- 配置java環(huán)境變量(linux mac windows7)
相關(guān)文章
crontab設(shè)置每分鐘、每小時(shí)、每天、每周、每月、每年定時(shí)執(zhí)行的腳本
這篇文章主要介紹了crontab設(shè)置每分鐘、每小時(shí)、每天、每周、每月、每年定時(shí)執(zhí)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04淺談安裝ORACLE時(shí)在Linux上設(shè)置內(nèi)核參數(shù)的含義
下面小編就為大家?guī)硪黄獪\談安裝ORACLE時(shí)在Linux上設(shè)置內(nèi)核參數(shù)的含義。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03利用Shell腳本循環(huán)讀取文件中每一行的方法詳解
讀取文件是我們?cè)谌粘9ぷ髦薪?jīng)常遇到的一個(gè)需求,下面這篇文章主要給大家介紹了關(guān)于利用Shell腳本循環(huán)讀取文件中每一行的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09Shell中使用scp命令實(shí)現(xiàn)文件上傳代碼
這篇文章主要介紹了Shell中使用scp命令實(shí)現(xiàn)文件上傳代碼,本文講解使用scp命令實(shí)現(xiàn)名登錄上傳文件,需要的朋友可以參考下2015-04-04Shell腳本實(shí)現(xiàn)批量生成nagios配置文件
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)批量生成nagios配置文件,本文使用配置文件模板加上文件替換的方法實(shí)現(xiàn)批量生成配置文件,需要的朋友可以參考下2015-07-07