詳解Linux中常見(jiàn)環(huán)境變量的特點(diǎn)與設(shè)置
前言
環(huán)境變量是操作系統(tǒng)和用戶設(shè)置的一些動(dòng)態(tài)鍵值對(duì),為運(yùn)行的程序提供配置信息。理解環(huán)境變量對(duì)于系統(tǒng)管理、軟件開(kāi)發(fā)都很重要。
一、環(huán)境變量的概念
環(huán)境變量是操作系統(tǒng)用來(lái)存儲(chǔ)和傳遞與系統(tǒng)環(huán)境相關(guān)信息的一種機(jī)制,是以鍵值對(duì)形式定義的全局變量,供操作系統(tǒng)和應(yīng)用程序讀取和使用。
通常格式為:
當(dāng)VALUE為多個(gè)時(shí),以‘:’符號(hào)隔開(kāi)
KEY=VALUE
- KEY:變量名
- VALUE:對(duì)應(yīng)值
那么它究竟有什么作用呢?我們來(lái)看這個(gè)例子:

從上面我們可以看到存在一個(gè)可執(zhí)行程序test,第一次我們執(zhí)行它,程序并沒(méi)有正常運(yùn)行,當(dāng)然都知道因?yàn)闆](méi)有指定程序所在路徑,所以程序不能正常運(yùn)行,第二次指定了不就運(yùn)行成功了,那么我們的指令在執(zhí)行時(shí)為什么不用指定路徑呢?在指令篇我們就介紹過(guò),指令的本質(zhì)就是一個(gè)寫好的可執(zhí)行程序,當(dāng)時(shí)我們說(shuō),如果我們想要讓自己寫的,可執(zhí)行程序,像指令一樣直接運(yùn)行,我們可以將程序拷貝到指令所在路徑下:/usr/bin
那還是沒(méi)有解釋為什么指令可以直接運(yùn)行,或者說(shuō)bash是如何找到指令的可執(zhí)行程序的呢?還有沒(méi)有其他方法可以使我們的可執(zhí)行程序像指令一樣運(yùn)行呢?接下來(lái)我們來(lái)認(rèn)識(shí)一下本篇第一個(gè)環(huán)境變量:PATH
PATH是操作系統(tǒng)中最核心的環(huán)境變量之一,當(dāng)我們?cè)诿钚休斎胍粋€(gè)命令時(shí),操作系統(tǒng)會(huì)按照PATH中定義的目錄依次搜索該命令對(duì)應(yīng)的可執(zhí)行文件,若未找到該命令對(duì)應(yīng)的可執(zhí)行文件就會(huì)提示:command not found。
查看PATH:
echo $PATH

PATH環(huán)境變量對(duì)應(yīng)多個(gè)值,使用“:"隔離開(kāi)
所以當(dāng)我們將自己寫的可執(zhí)行文件,拷貝到/usr/bin路徑下,系統(tǒng)在PATH對(duì)應(yīng)的目中就可以找到。
還有什么方法可以解決這里的問(wèn)題呢?只需要將我們自己寫的可執(zhí)行程序所在路徑添加到PATH環(huán)境變量中,不就也可以完成搜索了
PATH=$PATH:/home/ltn/dir


剛才的test于前面路徑存在的,可執(zhí)行程序重名了,所以又換了個(gè)程序給大家演示,但這恰恰說(shuō)明了系統(tǒng)是從第一個(gè)路徑向后搜索程序的。
我們使用which查找指令時(shí),就是在PATH環(huán)境變量中搜索的,所以現(xiàn)在我們就可以像查找指令一樣查找我們自己的可執(zhí)行程序了。

二、常見(jiàn)的環(huán)境變量
| 環(huán)境變量 | … 作用 | 對(duì)應(yīng)VALUE |
|---|---|---|
| HOME | 當(dāng)前用戶的主目錄路徑 | /home/ltn |
| USER | 當(dāng)前登錄用戶名 | ltn |
| PWD | 當(dāng)前工作目錄路徑 | /home/ltn |
| HISTSIZE | 記錄歷史指令最大數(shù) | 10000 |
查看環(huán)境變量:
查看所有環(huán)境變量:
env
查看指定環(huán)境變量:
echo $環(huán)境變量名
僅是截取的一部分

三、環(huán)境變量特點(diǎn)及其相關(guān)指令
為了方便接下來(lái)的講解,我先帶大家認(rèn)識(shí)一個(gè)關(guān)于環(huán)境變量的系統(tǒng)調(diào)用接口:

頭文件:#include<stdlib.h>
參數(shù):環(huán)境變量名
返回值:如果存在則返回一個(gè)指向環(huán)境變量名的指針,否則返回NULL
3.1 環(huán)境變量的全局性
環(huán)境變量最開(kāi)始是在我們登錄xshell時(shí),操作系統(tǒng)給bash形成的,當(dāng)我們執(zhí)行某些指令時(shí),bash會(huì)創(chuàng)建子進(jìn)程,并且將環(huán)境變量繼承下來(lái)(當(dāng)然會(huì)做某些修改),簡(jiǎn)單來(lái)說(shuō):環(huán)境變量是子進(jìn)程從父進(jìn)程那里繼承下來(lái)的。
接下來(lái)我們驗(yàn)證一下!!!
創(chuàng)建我們自己的環(huán)境變量:
export ltn =”1234“

我們?cè)诋?dāng)前bash進(jìn)程定義了一個(gè)環(huán)境變量,如果子進(jìn)程會(huì)繼承父進(jìn)程的環(huán)境變量,則可以打印出結(jié)果,否則程序什么都不輸出。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
printf("子進(jìn)程的ltn->%s\n",getenv("ltn"));
return 0;
}

可以看到程序成功打印,所以子進(jìn)程會(huì)繼承父進(jìn)程的環(huán)境變量。
3.2、環(huán)境變量的生命周期
- 環(huán)境變量的生命周期與進(jìn)程綁定
- 進(jìn)程終止時(shí),環(huán)境變量也會(huì)被回收
正是有了繼承的這種形式,我們之前所提到的權(quán)限概念,才會(huì)被每條指令遵守。
刪除環(huán)境變量:
unset ltn

四、環(huán)境變量的組織方式
我們之前在學(xué)習(xí)的C語(yǔ)言,不知道你有沒(méi)有聽(tīng)過(guò)main函數(shù)的參數(shù):
int main(int argc, char *argv[], char *env[])
第三個(gè)參數(shù)我們先不驗(yàn)證
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc, char *argv[], char *env[])
{
int i=0;
for(;i<argc;i++)
{
printf("argv[%d]->%s\n",i,argv[i]);
}
return 0;
}
這樣一段代碼,當(dāng)我們執(zhí)行它時(shí),結(jié)果會(huì)怎么樣呢?


可以看到我們以上面兩種不同的方式執(zhí)行,程序打印出了兩種不同的結(jié)果,要知道怎么會(huì)這樣,我們還是要知道參數(shù)是什么意思:
參數(shù)一 argc
作用:記錄命令行參數(shù)的數(shù)量
規(guī)則:
1、argc的值至少為1,因?yàn)榈谝粋€(gè)參數(shù)始終是程序自身的名稱。
2、用戶輸入的每個(gè)參數(shù)(以空格分隔)都會(huì)增加argc的值。
參數(shù)二 argv
作用:存儲(chǔ)命令行參數(shù)的具體值(用空格分開(kāi)的代表不同參數(shù)),以字符串?dāng)?shù)組的形式表示
規(guī)則:
1、argv[0] 是程序名稱(可能包含路徑,取決于調(diào)用方式)。
2 、argv[1] 到 argv[argc-1] 是用戶輸入的參數(shù)。
3、 argv[argc] 是一個(gè)空指針(NULL),表示數(shù)組結(jié)束。
參數(shù)三、env
作用:指向系統(tǒng)的環(huán)境變量數(shù)組(從bash那繼承的),每個(gè)元素是 KEY=VALUE 格式的字符串。
規(guī)則:
1、 環(huán)境變量數(shù)組以 NULL 結(jié)尾。
2、可以通過(guò) getenv() 函數(shù)更安全地獲取特定環(huán)境變量。
當(dāng)知道了main函數(shù)的這些參數(shù),我們就可以理解,為什么同一個(gè)指令加上不同的選項(xiàng)會(huì)有不同的功能了:當(dāng)你在執(zhí)行指令是帶上不同參數(shù),它就會(huì)存入到argv數(shù)組中,然后通過(guò)if else語(yǔ)句匹配不同代碼塊。實(shí)現(xiàn)不同功能。
五、C語(yǔ)言對(duì)環(huán)境變量的操作
5.1 設(shè)置環(huán)境變量:setenv

頭文件:#include<stdlib.h>
參數(shù):
name:設(shè)置的環(huán)境變量名
value:設(shè)置的環(huán)境變量值
overwrite:是否覆蓋已有值(非零表示覆蓋)
示例:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc, char *argv[], char *env[])
{
if(setenv("ltn","Hell Linux",0)==0);
{
printf("ltn set to->%s\n",getenv("ltn"));
}
return 0;
}

5.2 刪除環(huán)境變量:unsetenv

頭文件:#include<stdlib.h>
參數(shù):
name:環(huán)境變量名
示例:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc, char *argv[], char *env[])
{
if(setenv("ltn","Hell Linux",0)==0);
{
printf("ltn set to->%s\n",getenv("ltn"));
}
unsetenv("ltn");
printf("ltn->%s\n",getenv("ltn"));
return 0;
}

創(chuàng)建好,并刪除
5.3 遍歷所有環(huán)境變量:environ

environ是一個(gè)全局變量,內(nèi)部存有所有環(huán)境變量的指針,,末尾指針指向NULL,具體介紹太長(zhǎng),不方便展示,大家可以自己看。
示例:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
extern char**environ;
int main(int argc, char *argv[], char *env[])
{
char **env1=environ;
while(*env1)
{
printf("%s",*env1);
env1++;
}
return 0;
}

僅截取部分打印結(jié)果
下面我們來(lái)說(shuō)一下第三給參數(shù),第三參數(shù),是一個(gè)環(huán)境變量數(shù)組,也就是說(shuō),我們可以通過(guò)直接變量得到全部環(huán)境變量:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
extern char**environ;
int main(int argc, char *argv[], char *env[])
{
int i=0;
while(env[i])
{
printf("%s\n",env[i]);
i++;
}
return 0;
}
以上就是詳解Linux中常見(jiàn)環(huán)境變量的特點(diǎn)與設(shè)置的詳細(xì)內(nèi)容,更多關(guān)于Linux環(huán)境變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux系統(tǒng)下快速配置HugePages的完整步驟
這篇文章主要給大家介紹了關(guān)于如何在Linux系統(tǒng)下快速配置HugePages的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
linux expect 自動(dòng)登錄交換機(jī)保存配置的方法
今天小編就為大家分享一篇linux expect 自動(dòng)登錄交換機(jī)保存配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
centos 6.5 oracle開(kāi)機(jī)自啟動(dòng)的環(huán)境配置詳解
這篇文章主要介紹了centos 6.5 oracle開(kāi)機(jī)自啟動(dòng)的環(huán)境配置詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實(shí)現(xiàn)方式
這篇文章主要介紹了關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

