一、PATH環(huán)境變量
1.什么是PATH環(huán)境變量
這里我們先提出一個(gè)問(wèn)題:為什么我們運(yùn)行自己寫的程序需要帶路徑,而系統(tǒng)的指令不需要帶路徑?
這是因?yàn)橄到y(tǒng)能找到它的位置,系統(tǒng)中是存在相關(guān)的環(huán)境變量,保存了程序的搜索路徑的,系統(tǒng)中搜索可執(zhí)行程序的環(huán)境變量叫做PATH。所以我們只需要把我們的程序拷貝到/usr/bin/路徑下即可(但是我們不推薦,理由下面解釋)
首先我們理解什么是環(huán)境變量
環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來(lái)指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù)
如:我們?cè)诰帉慍/C++代碼的時(shí)候,在鏈接的時(shí)候,從來(lái)不知道我們的所鏈接的動(dòng)態(tài)靜態(tài)庫(kù)在哪里,但是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找。
環(huán)境變量通常具有某些特殊用途,還有在系統(tǒng)當(dāng)中通常具有全局特性
所以事實(shí)上,Linux中的各種指令本質(zhì)上是/usr/bin目錄下的一個(gè)個(gè)可執(zhí)行的程序,和我們自己編寫的可執(zhí)行程序沒(méi)有任何區(qū)別。但是使用指令的時(shí)候,系統(tǒng)會(huì)自動(dòng)去PATH中尋找指令,如果找到了就執(zhí)行,沒(méi)有找到就報(bào)錯(cuò)-“command not found”,所以Linux中的各種指令不需要指定路徑,而我們自己寫的程序需要指定路徑
2.如何添加PATH環(huán)境變量
我們可以使用如下指令來(lái)查看PATH環(huán)境變量中包含的內(nèi)容:
echo $PATH
我們需要注意的是,PATH中不同的路徑分隔符為:
我們也可以通過(guò)向PATH中添加內(nèi)容讓我們自己的程序可以不指定路徑就能被執(zhí)行
方法一:直接將程序添加到/usr/bin目錄下(不建議使用這種方法,因?yàn)槲覀儗懙某绦驔](méi)有經(jīng)過(guò)測(cè)試,可能會(huì)污染指令池)
我們刪除使用如下指令:
sudo rm /usr/bin/mycmd
之后我們執(zhí)行我們自己寫的程序又需要帶上路徑
方法二:使用export命令將當(dāng)前可執(zhí)行程序的路徑導(dǎo)入PATH
export PATH=$PATH:當(dāng)前路徑
【注意】
$PATH代表之前的PATH中的內(nèi)容,:之后的尾新添加的內(nèi)容,所以我們不能直接使用如下指令:
export PATH=當(dāng)前路徑
因?yàn)檫@樣會(huì)將之前PATH中的內(nèi)容覆蓋掉,使得Linux中的各種指令必須指定目錄才能執(zhí)行,因?yàn)椴僮飨翟?usr/bin找不到系統(tǒng)中原來(lái)的指令了,此時(shí),我們只需要重新登錄即可,因?yàn)榄h(huán)境變量屬于內(nèi)存級(jí)變量,我們每次登錄shell的時(shí)候,環(huán)境變量都會(huì)重新編譯執(zhí)行。同時(shí),PATH中不能有空格,因?yàn)長(zhǎng)inux中以空格作為分隔符
我們學(xué)過(guò)Java的同學(xué)都知道,我們?cè)谧铋_(kāi)始學(xué)的時(shí)候需要在windows中配置環(huán)境變量,其實(shí)本質(zhì)就是向PATH中添加內(nèi)容(windows中的路徑分隔符為分號(hào))
windows下查看環(huán)境變量:
設(shè)置->關(guān)于->高級(jí)系統(tǒng)設(shè)置->環(huán)境變量
3.系統(tǒng)中的其他環(huán)境變量
PATH環(huán)境變量只是系統(tǒng)中眾多環(huán)境變量的一種,除了PATH,我們還有許多其他環(huán)境變量,不同的環(huán)境變量有不同的功能,也適用于不同的場(chǎng)景
PATH : 指定命令的搜索路徑
HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時(shí),默認(rèn)的目錄)
SHELL : 當(dāng)前Shell,它的值通常是/bin/bash
HOSTNAME:主機(jī)名
USER:當(dāng)前用戶名
PWD:當(dāng)前系統(tǒng)路徑
HISTSIZE:shell能記住的最多的歷史命令的數(shù)量
我們也可以使用env命令來(lái)查看系統(tǒng)中所有的環(huán)境變量:
4.環(huán)境變量的來(lái)源
我們使用“ ls - al /hone/hdp”指令就可以發(fā)現(xiàn)家目錄下 存在兩個(gè)隱藏文件–.bash_profile與.bashrc:
實(shí)際上,我們?cè)诘卿泂hell的時(shí)候,操作系統(tǒng)會(huì)讓我們當(dāng)前的shell進(jìn)行執(zhí)行.bash_profile文件內(nèi)的內(nèi)容,而.bash_profile又會(huì)調(diào)用執(zhí)行.bashrc,他們會(huì)將對(duì)應(yīng)的環(huán)境變量導(dǎo)入到shell進(jìn)程的上下文環(huán)境中,所以,這樣解釋了為什么我們把$PATH覆蓋了之后,重新登錄shell之后就可以了
環(huán)境變量的定義
環(huán)境變量是操作系統(tǒng)為了滿足不同的應(yīng)用場(chǎng)景,預(yù)先在系統(tǒng)內(nèi)設(shè)置一大批全局變量,這些變量往往具有特殊功能,且能夠一直被bash以及bash的子進(jìn)程訪問(wèn)。
環(huán)境變量具有全局屬性的根本原因是環(huán)境變量會(huì)被子進(jìn)程繼承
二、環(huán)境變量的操作
1.設(shè)置環(huán)境變量
Linux命令行的可以定義變量的,但是我們以這種方式定義的變量吧本地變量,即只在bash進(jìn)程中有效,而不是環(huán)境變量,因?yàn)榄h(huán)境變量具有全局屬性
我們可以使用export直接定義環(huán)境變量,也可以使用它將已經(jīng)存在的本地變量變成環(huán)境變量
我們可以使用set命令來(lái)查看所有變量,包括環(huán)境變量和本地變量,使用unset來(lái)取消變量,包括環(huán)境變量和本地變量
2.通過(guò)getenv獲取環(huán)境變量
我們可以使用 echo $環(huán)境變量名 來(lái)獲取特定的環(huán)境變量,也可以通過(guò)getenv()函數(shù)來(lái)獲取環(huán)境變量:
其中name是我們需要獲取環(huán)境變量的名稱,如果獲取成功就返回環(huán)境變量的具體內(nèi)容,失敗就返回NULL
這樣我們就可以使用getenv()函數(shù)來(lái)編寫系統(tǒng)中某些指令了,比如pwd:
#include <stdio.h>
#include <stdlib.h>
#define MYPWD "PWD"
int main()
{
char* env = getenv(MYPWD);
printf("%s\n",env);
return 0;
}
3.環(huán)境變量的意義
我們知道,環(huán)境變量是操作系統(tǒng)為了滿足不同的應(yīng)用場(chǎng)景,預(yù)先在系統(tǒng)內(nèi)設(shè)置的一大批全局變量,其中PATH就是為了滿足我們指令路徑搜索的需求,而除了指令需求之外還有許多其他需求,其中非常重要的一個(gè)就是身份認(rèn)證
我們以一個(gè)例子說(shuō)明:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define USER "USER"
int main()
{
char* who = getenv(USER);
if(strcmp(who,"root")==0)
{
printf("user:%s\n",who);
printf("user:%s\n",who);
printf("user:%s\n",who);
printf("user:%s\n",who);
printf("user:%s\n",who);
}
else
{
printf("權(quán)限不足\n");
}
return 0;
}
我們這里使用su -,而不是su,因?yàn)閟u -會(huì)重新登錄shell,此時(shí)shell會(huì)重新加載環(huán)境變量,讓$USER從hdp變成root,而su只是把用戶身份切換為root
我們可以在程序內(nèi)部通過(guò)getenv函數(shù)來(lái)獲取當(dāng)前Linux用戶,然后判斷其是否具備某種權(quán)限,再執(zhí)行對(duì)應(yīng)的操作
此外,我們還可以使用stat來(lái)獲取一個(gè)文件的其他屬性,比如讀寫執(zhí)行等,然后根據(jù)這些屬性判斷一個(gè)用戶是否能對(duì)該文件進(jìn)行對(duì)應(yīng)的操作
stat指令是一個(gè)用于顯示文件或目錄詳細(xì)信息的命令,包括文件大小、創(chuàng)建時(shí)間、修改時(shí)間、訪問(wèn)時(shí)間和權(quán)限等。在Linux和Unix操作系統(tǒng)中,stat命令通常使用以下語(yǔ)法:
stat [選項(xiàng)] 文件名
其中,選項(xiàng)可以是以下之一:
-
-c
:指定自定義格式輸出。 -
-f
:指定文件系統(tǒng)信息輸出格式。 -
-t
:指定時(shí)間格式輸出。
三、命令行參數(shù)
我們出來(lái)可以通過(guò)getenv函數(shù)來(lái)獲取環(huán)境變量,還可以通過(guò)命名行參數(shù)來(lái)獲取環(huán)境變量
我們知道,C語(yǔ)言中的main函數(shù)是有參數(shù)的,這些參數(shù)可以通過(guò)命令行進(jìn)行傳遞:
int main(int argc,char* argv[],char* env);
其中argc是一個(gè)整數(shù),代表的是argv數(shù)組元素的個(gè)數(shù),argv是一個(gè)指針數(shù)組,數(shù)組里面的每一個(gè)元素都指向一個(gè)字符串
我們可以打印argv數(shù)組中存放的環(huán)境變量,增加選項(xiàng)時(shí)環(huán)境變量也隨之增加
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv[],char* env[])
{
int i = 0;
for(i = 0; i < argc; ++i)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
他們配合使用就可以實(shí)現(xiàn)類似于"ls -a -l -d"選項(xiàng)的功能,通過(guò)我們傳遞不同的選項(xiàng)使用不同的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[],char* env[])
{
if(argc != 2)
{
printf("Usage: \n\t\%s [-a/-b/-c/-ab/-ac/-bc]\n",argv[0]);
}
if(strcmp("-a",argv[1]) == 0)
{
printf("功能a\n");
}
if(strcmp("-b",argv[1]) == 0)
{
printf("功能b\n");
}
if(strcmp("-c",argv[1]) == 0)
{
printf("功能c\n");
}
if(strcmp("-ab",argv[1]) == 0)
{
printf("功能ab\n");
}
if(strcmp("-ac",argv[1]) == 0)
{
printf("功能ac\n");
}
if(strcmp("-bc",argv[1]) == 0)
{
printf("功能bc\n");
}
return 0;
}
而指針數(shù)組env就是用于接受父進(jìn)程傳遞過(guò)來(lái)的環(huán)境變量的參數(shù),我們可以在main函數(shù)中打印env的內(nèi)容:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char* argv[],char* env[])
{
int i = 0;
for(i = 0; env[i]; ++i)
{
printf("env[%d]:%s\n",i,env[i]);
}
return 0;
}
程序也可以通過(guò)環(huán)境表environ來(lái)獲取環(huán)境變量–環(huán)境變量表是一個(gè)字符指針數(shù)組,每個(gè)指針指向一個(gè)以’\0’結(jié)尾的環(huán)境變量字符串,每個(gè)進(jìn)程都會(huì)收到一張環(huán)境變量表
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-758276.html
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char* argv[],char* env[])
{
extern char** environ;
int i = 0;
for(i = 0; environ[i]; ++i)
{
printf("%d:%s\n",i,environ[i]);
}
return 0;
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758276.html
到了這里,關(guān)于【Linux】環(huán)境變量--PATH環(huán)境變量/環(huán)境變量的操作/命令行參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!