自用電腦做網(wǎng)站百度seo優(yōu)化服務(wù)項目
前言:在結(jié)束完上一篇的命令行參數(shù)時,我們簡單的了解了一下Linux中的環(huán)境變量PATH
,而環(huán)境變量不只有PATH
,關(guān)于更多環(huán)境變量的知識我們將在本篇展開!
本篇主要內(nèi)容:
常見的環(huán)境變量
獲取環(huán)境變量的三種方式
本地變量與環(huán)境變量
環(huán)境變量的配置文件
內(nèi)建命令與常規(guī)命令
環(huán)境變量
- 1. 初識環(huán)境變量
- 2. 獲取環(huán)境變量的方法
- 2.1 方法一:getenv
- 2.2 方法二:通過main函數(shù)
- 2.3 方法三:全局變量environ
- 3. 環(huán)境變量的配置文件
- 4. 本地變量與環(huán)境變量
- 5. 環(huán)境變量的全局性
- 6. 內(nèi)建命令與常規(guī)命令
- 7. 總結(jié)
1. 初識環(huán)境變量
首先,我們先來了解一下什么是環(huán)境變量!
基本概念:
- 環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運行環(huán)境的一些參數(shù)
- 我們編寫代碼在鏈接的時候,從來不知道我們的所鏈接的動態(tài)靜態(tài)庫在哪里,但是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進行查找。
- 環(huán)境變量通常具有某些特殊用途,還有在系統(tǒng)當(dāng)中通常具有全局特性
而我們介紹幾個比較常見的環(huán)境變量
常見環(huán)境變量:
PATH
: 指定命令的搜索路徑
HOME
: 指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時,默認的目錄)
PWD
: 記錄當(dāng)前路徑,pwd就是調(diào)用了PWD環(huán)境變量
拓展:我們在登錄xshell的時候系統(tǒng)其實會做以下操作:
- 輸入用戶名,密碼
- 認證
- 形成環(huán)境變量
- 根據(jù)用戶名,初始化HOME=/root,HOME=/home/…
- cd $HOME
在Linux中環(huán)境變量有很多,我們可以使用指令來查看所有環(huán)境變量
指令:env
系統(tǒng)中會存在大量的環(huán)境變量,每一環(huán)境變量都有自己的用途來完成特定的功能!
2. 獲取環(huán)境變量的方法
在Linux我們有很多種方法能夠過去環(huán)境變量,這里我們簡單介紹三種!
2.1 方法一:getenv
其實在Linux中我們有直接獲取的函數(shù):getenv()
我們來簡單操作一遍:
1 #include<stdio.h>2 #include<stdlib.h>3 4 int main()5 {6 printf("PATH: %s\n",getenv("PATH"));7 return 0;8 }
這是最簡單的一種獲取環(huán)境變量的方式,讓我們繼續(xù)來介紹幾種!
2.2 方法二:通過main函數(shù)
在我們查看環(huán)境變量時,其實他也是一個類似于命令行參數(shù)表的
系統(tǒng)在進行創(chuàng)建啟動程序時,可以給進程(main)提供兩張表:
- 命令行參數(shù)表
- 環(huán)境變量表
而這個環(huán)境變量表也是可以通過main
函數(shù)來獲取的
1 #include<stdio.h>2 #include<stdlib.h>3 4 int main(int argc, char *argv[], char *env[])5 {6 int i = 0;7 for(i = 0; env[i]; i++)8 {9 printf("env[%d]: %s\n",i, env[i]);10 }11 return 0;12 }
2.3 方法三:全局變量environ
最后要介紹的一種方法是全局變量environ
1 #include<stdio.h>2 #include<stdlib.h>3 #include<sys/types.h>4 #include<unistd.h>5 6 int main()7 {8 extern char **environ;9 int i = 0;10 for(i = 0; environ[i]; i++)11 {12 printf("%d: %s\n",i, environ[i]); 13 }14 return 0;15 }
3. 環(huán)境變量的配置文件
命令行啟動的進程都是shell/bash的子進程,子進程的命令行參數(shù)和環(huán)境變量是父進程bash給我們傳遞的!
當(dāng)我們將PATH環(huán)境變量置為空串時:
我們發(fā)現(xiàn)有很多的指令都用不了了,但當(dāng)我們重新登錄之后,又可以恢復(fù)正常!
其實:我們直接更改的是bash進程內(nèi)部的環(huán)境變量信息!每一次重新登陸,都會給我們形成新的bash解釋器并且新的bash解釋器自動從讀取形成自己的環(huán)境變量表信息!
而它的實質(zhì)其實是每次重新登陸都會讀取系統(tǒng)自帶的配置文件.bash_profile
,配置文件中的內(nèi)容,為我們bash進程形成一張環(huán)境變量表信息!
如果我們想讓我們的環(huán)境變量能夠保存可以直接在配置文件中更改,下面會講!
4. 本地變量與環(huán)境變量
Linux中,我們可以在bash中直接定義環(huán)境變量
指令:變量名=內(nèi)容
但是當(dāng)我們在環(huán)境變量表里獲取我們自定義的變量時,是獲取不了的。使用env也獲取不了剛才定義的環(huán)境變量
實際上: 我們用戶自己定義的環(huán)境變量是本地變量
如果想要我們定義的環(huán)境變量我們該怎么辦,這時我們需要一條新的指令
指令:export 變量名
有了export
我們就可以將我們自定義的環(huán)境變量添加到bash上下文的環(huán)境變量中
除了這種寫法,我們還可以直接省略成一步。
我們用
export
指令可以將自己寫的環(huán)境變量添加到父進程bash的進程上下文中,但是如果我們重新登錄后,之前導(dǎo)入的變量是否還會存在?
- 答案很明顯,我們變量之會被添加到內(nèi)存中,并不會改變配置文件,所以重新登錄后并不會被保存
- 因此如果我們想讓我們的環(huán)境變量能夠保存可以直接在配置文件中更改
5. 環(huán)境變量的全局性
環(huán)境變量的全局性能夠被所有進程獲取
讓我們先來看看下面這段代碼:
1 #include<stdio.h>2 #include<stdlib.h>3 #include<sys/types.h>4 #include<unistd.h>5 6 int main()7 {8 pid_t id = fork();9 if(id == 0)10 {11 // 子進程12 extern char **environ;13 int i = 0;14 for(i = 0; environ[i]; i++)15 {16 printf("%d: %s\n", i, environ[i]);17 }18 }19 sleep(4); 20 return 0;21 }
我們在程序中直接創(chuàng)建子進程,然后讓父進程什么也不做,來測試一下子進程能否獲取父進程的父進程bash的環(huán)境變量?
那我們自定義的本地變量能不能被子進程繼承呢?
OUR_ENV=2004printf("OUR_ENV: %s\n",getenv("OUR_ENV"));
在了解完環(huán)境變量的全局性時,我們現(xiàn)在再來看看本地變量和環(huán)境變量的區(qū)別:
- 本地變量只在bash進程內(nèi)部有效,不會被子進程繼承下去
- 環(huán)境變量通過讓所有的子進程繼承的方式,實現(xiàn)自身的全局性!
6. 內(nèi)建命令與常規(guī)命令
我們在之前就提到過,bash中的指令可以直接使用,不用加./是因為存在環(huán)境變量PATH,所以我PATH置空后,這些命令就會失效
但是我們置空PATH
后,pwd
依然可以正常使用,這是為什么呢?到了這里我們有得引出新的概念:
Linux的命令分類:
- 常規(guī)命令,shell fork讓子進程成執(zhí)行的
- 內(nèi)建命令,shell命令行的一個函數(shù),當(dāng)然可以直接讀取shell內(nèi)部定義的本地變量!
我們雖然讓PATH掛掉了,但是我們并沒有讓shell掛掉,因此shell內(nèi)部定義的變量我們依然可以正常使用
注意:
echo
也是一個內(nèi)建命令
7. 總結(jié)
本篇我們了解環(huán)境變量,讓我們來回顧一下和環(huán)境變量相關(guān)的命令:
- echo: 顯示某個環(huán)境變量值
- export: 設(shè)置一個新的環(huán)境變量
- env: 顯示所有環(huán)境變量
- unset: 清除環(huán)境變量
- set: 顯示本地定義的shell變量和環(huán)境變量
環(huán)境變量的學(xué)習(xí)重在理解,細節(jié)比較多,而且有很多新概念,所以認真,細心的學(xué)習(xí)環(huán)境變量是很重要的。
謝謝大家支持本篇到這里就結(jié)束了,讓我們期待下一篇的進程地址空間