文章目錄
- 環境變數
- 1.什么是環境變數
- 2.環境變數的作用
- 3.在命令列配置環境變數
- 查看環境變數---env
- 列印某個變數內容---echo
- 查看變數內容---set
- 宣告定義轉換變數---export
- 洗掉變數---unset
- 4.在代碼中配置環境變數
- 獲取環境變數
- 方法一:getenv函式
- 方法二:main的第三個引數
- 方法三:宣告庫中environ變數
- 設定環境變數
- 方法一:setenv函式
- 方法二:putenv函式
- 洗掉環境變數
- unsetenv函式
- 5.環境變數在記憶體中的存盤位置
- 6.關于執行檔案路徑的變數:$PATH
環境變數
1.什么是環境變數
- 定義:環境變數(environment variables)一般是指在作業系統中用來指定作業系統運行環境的一些引數
簡單來說就是 系統運行環境配置的變數
2.環境變數的作用
- 設定引數:環境變數相當于給系統或用戶應用程式設定了一些引數,具體作用看用戶或系統定義它的初心是干啥的,例如要求運行一個程式時沒有告訴它程式所在路徑時,系統除了在當前目錄中尋找該程式,還會在環境變數PATH中尋找
3.在命令列配置環境變數
重要的五個命令:env echo export set unset
查看環境變數—env
顯示出當前系統中已定義的所有環境變數,其中每個環境變數以**鍵值對(NAME=VALUE)**的形式展示出來
[gongruiyang@localhost ~]$ env

這些變數中比較重要的是PATH環境變數,這個環境變數中存著程式運行默認搜索路徑,后面會詳細解釋,
列印某個變數內容—echo
echo是用來顯示、列印的命令
echo 字串 —> 原樣列印字串
echo $字串 —> $后面字串是一個變數名稱,將變數值列印出來
[gongruiyang@localhost ~]$ echo PATH
PATH
[gongruiyang@localhost ~]$ MyValue=2020 <---自定義變數
[gongruiyang@localhost ~]$ echo $MyValue <---查看自定義變數
2020
[gongruiyang@localhost ~]$ echo $PATH <---查看環境變數
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/gongruiyang/.local/bin:/home/gongruiyang/bin:/home/gongruiyang/ClassLinunx
查看變數內容—set
查看所有變數內容,既可以查看環境變數,也可以查看自定義變數
[gongruiyang@localhost ~]$ MyValue=2020 <---自定義變數
[gongruiyang@localhost ~]$ echo $MyValue <---查看變數
2020
[gongruiyang@localhost ~]$ env | grep MyValue <---在環境變數中尋找MyValue變數,沒有找到
[gongruiyang@localhost ~]$ set | grep MyValue <---在所有變數中尋找MyValue變數,找到了并列印
MyValue=2020
宣告定義轉換變數—export
將自定義變數轉換成環境變數
[gongruiyang@localhost ~]$ export MyValue <---將自定義變數MyValue轉換為環境變數
[gongruiyang@localhost ~]$ env | grep MyValue <---在環境變數中尋找MyValue變數,找到了并列印
MyValue=2020
[gongruiyang@localhost ~]$ export MV=1999 <---宣告并定義并添加環境變數MV
[gongruiyang@localhost ~]$ env | grep MV
MV=1999
洗掉變數—unset
unset命令既可以洗掉自定義變數,也可以洗掉環境變數
[gongruiyang@localhost ~]$ BBBB=100
[gongruiyang@localhost ~]$ set | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ env | grep BBBB
[gongruiyang@localhost ~]$ export BBBB
[gongruiyang@localhost ~]$ set | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ env | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ unset BBBB <---將變數BBBB洗掉
[gongruiyang@localhost ~]$ set | grep BBBB
[gongruiyang@localhost ~]$ env | grep BBBB
4.在代碼中配置環境變數
獲取環境變數
方法一:getenv函式
char *getenv(const char *name);
name : 環境變數名稱
回傳值 :環境變數內容的首地址
用命令列查看TESTVALUE環境變數:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//通過環境變數名稱獲取環境變數值
char *temp = getenv("TESTVALUE");
if(temp == NULL)
printf("No env var : TESTVALUE\n");
else
printf("TESTVALUE:[%s]\n",temp);
return 0;
}
運行結果如下:

方法二:main的第三個引數
解釋:只要運行main函式,環境變數都會被傳進來,平時我們用不到環境變數,所以沒去接收罷了
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[],char *env[])
{
int i;
for(i=0;env[i]!=NULL;i++)
printf("env[%d]:[%s]\n",i,env[i]);
return 0;
}
輸出結果:將環境變數以鍵值對的方式輸出
[gongruiyang@localhost ClassLinunx]$ vim env.c
[gongruiyang@localhost ClassLinunx]$ make
gcc env.c -o env
[gongruiyang@localhost ClassLinunx]$ ./env
env[0]:[XDG_SESSION_ID=3]
env[1]:[HOSTNAME=localhost.localdomain]
env[2]:[SELINUX_ROLE_REQUESTED=]
env[3]:[TERM=xterm]
env[4]:[SHELL=/bin/bash]
env[5]:[HISTSIZE=1000]
env[6]:[SSH_CLIENT=192.168.233.1 58862 22]
env[7]:[SELINUX_USE_CURRENT_RANGE=]
env[8]:[OLDPWD=/home/gongruiyang]
env[9]:[SSH_TTY=/dev/pts/0]
env[10]:[USER=gongruiyang]
env[11]:[LD_LIBRARY_PATH=:/home/gongruiyang/.VimForCpp/vim/bundle/YCM.so/el7.x86_64]
..................................................
方法三:宣告庫中environ變數
注意哦!environ這個變數在庫中是存在的,你只需要使用extern宣告引入該變數就可以啦!
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
extern char** environ;
for(int i = 0; env[i]!=NULL;i++)
printf("environ[%d]:[%s]\n",i,environ[i]);
return 0;
}
輸出結果:
[gongruiyang@localhost ClassLinunx]$ ./env
environ[0]:[XDG_SESSION_ID=3]
environ[1]:[HOSTNAME=localhost.localdomain]
environ[2]:[SELINUX_ROLE_REQUESTED=]
environ[3]:[TERM=xterm]
environ[4]:[SHELL=/bin/bash]
environ[5]:[HISTSIZE=1000]
environ[6]:[SSH_CLIENT=192.168.233.1 58862 22]
environ[7]:[SELINUX_USE_CURRENT_RANGE=]
environ[8]:[OLDPWD=/home/gongruiyang]
environ[9]:[SSH_TTY=/dev/pts/0]
environ[10]:[USER=gongruiyang]
environ[11]:[LD_LIBRARY_PATH=:/home/gongruiyang/.VimForCpp/vim/bundle/YCM.so/el7.x86_64]
.........................................
設定環境變數
方法一:setenv函式
作用:①添加一個不存在的環境變數 ②修改一個已存在的環境變數值
int setenv( const char *name , const char *value , int overwrite )
- 引數串列:
- name : 環境變數的名字
- value : 環境變數的值
- overwrite : 0 表示如果環境變數已存在不覆寫原值 ; 非0 表示如果環境變數已存在覆寫原值
- 回傳值 : 0 表示成功 ;-1表示錯誤
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
//獲取當前系統中環境變數TESTVALUE的值
printf("Befor:[%s]\n",getenv("TESTVALUE"));
//設定TESTVALUE的值為2020
int ret_Modify_setenv = setenv("TESTVALUE","2020",1);
if(!ret_Modify_setenv)
printf("Modify success!After:[%s]\n",getenv("TESTVALUE"));
else
printf("Modify error!\n");
//添加一個新的環境變數
int ret_Add_setenv = setenv("NEWADDVALUE","2020",1);
if(!ret_Add_setenv)
printf("Add success!NEWADDVALUE:[%s]\n",getenv("NEWADDVALUE"));
else
printf("Add error!\n");
return 0;
}
[gongruiyang@localhost ClassLinunx]$ vim env.c
[gongruiyang@localhost ClassLinunx]$ make
gcc env.c -o env
[gongruiyang@localhost ClassLinunx]$ ./env
Befor:[1000]
Modify success!After:[2020]
Add success!NEWADDVALUE:[2020]
方法二:putenv函式
作用:添加或修改環境變數
int putenv( char *string );
- 引數串列:string -> 由name=value組成
- 回傳值:0 表示 成功;非零表示
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
char* string = "MyV=1999";
int ret_putenv = putenv(string);
//判斷是否成功
if(!ret_putenv)
printf("put success!string:[%s]\n",getenv("MyV"));
else
printf("put error!\n");
return 0;
}
程式運行結果:
[gongruiyang@localhost ClassLinunx]$ ./env
put success!string:[1999]
洗掉環境變數
unsetenv函式
作用:
int unsetenv( const char *name );
- 引數串列:name -> 環境變數名稱
- 回傳值 :0 表示 洗掉成功;-1 表示 洗掉失敗
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
const char* name = "NEWADDVALUE";
//獲取NEWADDVALUE環境變數的值
printf("%s=%s\n",name,getenv(name));
//洗掉NEWADDVALUE環境變數
int ret_unsetenv = unsetenv(name);
//判斷是否洗掉成功
if(ret_unsetenv == 0)
printf("delete success!%s=%s\n",name,getenv(name));
else
printf("delete error!\n");
return 0;
}
輸出結果:
[gongruiyang@localhost ClassLinunx]$ ./env
NEWADDVALUE=2020
delete success!NEWADDVALUE=(null)
5.環境變數在記憶體中的存盤位置

6.關于執行檔案路徑的變數:$PATH
- 引例
想一想:為什么我們可以在Linux命令列模式中的任何目錄中執行 ls 命令?
ls命令的完整檔案名為:/bin/ls <—這是絕對路徑
之所以我們在Linux命令列模式中的任何目錄中執行 ls 都會顯示出檔案資訊,而不會說找不到該 /bin/ls 命令,這是因為環境變數PATH的幫助所致
- 原理
以 ls 命令為例,當我們輸入 ls 并按下回車時,系統知道你要執行一個名叫 ls 的可執行檔案,這時,系統會在PATH中定義的目錄下查找檔案名為 ls 的可執行檔案,如果在PATH中定義的目錄中含有多個檔案名為 ls 的可執行檔案,那么找到的第一個檔案名為 ls 的檔案先執行
- 查看有哪些檔案路徑已被定義在PATH中
使用命令: echo $PATH

上圖中列印出來的是gongruiyang身份下環境變數中定義了哪些目錄,每個目錄用冒號(:)分開
所以可以看出gongruiyang身份下環境變數中已定義的檔案目錄有:
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/gongruiyang/.local/bin
/home/gongruiyang/bin
我們來看看root身份下的環境變數中有些啥

我的Linux系統中root身份和gongruiyang身份中環境變數是一樣的(你的可能不一樣,這很正常,環境變數中的內容是可以增減修改的,后面會詳說~)
<: 這里可以更清楚的知道為啥我們在Linux命令列模式中的任何目錄下都能執行 ls 了,因為無論是在root身份下還是在gongruiyang身份下的環境變數中都定義了 user/bin 目錄,所以系統會到該目錄下搜索 ls 命令,搜索到了就執行啦
總結:環境變數是由一堆目錄組成的,這些目錄之間由冒號隔開,每個目錄之間有先后之分
- 拓展
想一想:如何讓我們寫的可執行程式檔案,無論在哪個目錄中都可以被運行呢?
我們寫了一個輸出一句話的程式
#include <stdio.h>
int main()
{
printf("This is AKA giao, peace & love.\n");
return 0;
}
使用命令將其編譯成可執行檔案Mytest
gcc test.c -o test
我們在/home/gongruiyang/ClassLinunx目錄下可以執行test可執行檔案
[gongruiyang@localhost ClassLinunx]$ ls
myTest test.c
[gongruiyang@localhost ClassLinunx]$ pwd
/home/gongruiyang/ClassLinunx <----當前路徑
[gongruiyang@localhost ClassLinunx]$ myTest
This is AKA giao, peace & love. <----程式輸出
但是我們換一個目錄,再執行就會出現下面的結果,并不能找到myTest這個可執行檔案
[gongruiyang@localhost ClassLinunx]$ cd ..
[gongruiyang@localhost ~]$ myTest
bash: myTest: 沒有那個檔案或目錄
為了解決無論從那個目錄都能運行test可執行程式,我們需要把它所在的目錄放進環境變數PATH中去
- 環境變數PATH的增加
目標:將/home/gongruiyang/ClassLinunx目錄放入環境變數PATH中,讓我們的test程式無論在哪都能執行
使用 環境變數PATH增加 命令:
PATH="${PATH}:待添加目錄"
會有以下現象:

這時,我們已經將包含myTest可執行檔案的目錄放到環境變數中,默認搜索路徑就包括了ClassLinux這個檔案夾,我們嘗試在其他目錄下運行myTest這個可執行檔案就不會出現找不到檔案的情況啦
[gongruiyang@localhost TestDIR]$ pwd
/home/gongruiyang/TestDIR
[gongruiyang@localhost TestDIR]$ myTest
This is AKA giao, peace & love.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225452.html
標籤:其他
上一篇:Nginx反向代理
