=========================================================================
個人主頁點擊直達:小白不是程序媛
Linux專欄:Linux系統化學習
代碼倉庫:Gitee
=========================================================================
目錄
mian函數傳參獲取環境變量
手動添加環境變量
導出環境變量
environ獲取環境變量
本地變量和環境變量的區別
Linux的命令分類
常規命令
內建命令
環境變量相關指令
mian函數傳參獲取環境變量
上篇文章中我們介紹到C/C++的mian函數是有兩個參數的,其實main函數還有第三個參數是用來獲取我們的環境變量的。
1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<sys/types.h>5 #include<unistd.h>6 int main(int argc ,char * argv[],char * env[])7 {8 int i=0;9 for(;env[i];i++)10 {11 printf("pid: %d , env[%d]:%s\n",getpid(),i,env[i]); 12 }13 }
?
左邊是我們使用指令env得到的結果,右邊是我們運行上面得到的結果;對比兩者得到的內容,我們會發現是一樣的?。其實當我們使用指令啟動進程時候都是shell/bash的子進程,因此子進程的命令行參數和環境變量,都是父進程給我們傳遞的。
父進程確實可以將環境變量傳遞給子進程,說明父進程是有環境變量的但是父進程shell/bash的環境變量是哪來的呢?
要解決這個問題我們還要回顧上篇文章的內容,上篇文章我們提到環境變量是可以修改的如果我們不小心修改錯了會怎么辦呢?不妨上手試一試。
模擬誤操作后我們會發現一些基礎的指令使用不了了,不必擔心只需要重新啟動我們的xshell即可。
通過這個小實驗我們可以證明:
- 環境變量信息是以腳本配置文件的形式存在的。
- 我們更改的是bash進程內部的環境變量信息,每一次重新登錄,都會給我們形成新的bash解釋器并且新的bash解釋器自動讀取環境變量配置文件形成自己的環境變量信息?。
這個配置文件是存在在我們家目錄的一個隱藏文件。
因此上面的問題都解釋通了:每一次驗證登錄時bash都會讀取.bash_profile這個配置文件中的內容,為bash生成一張環境變量信息表。
手動添加環境變量
Linux下添加環境變量并沒有指令,按照系統內自定的環境變量格式直接在命令行中輸入即可。
我們手動設置的環境變量其實是本地變量,并不在系統的環境變量表中。
導出環境變量
export+環境變量名+環境變量內容
但是我們導出的環境變量只存在于bash進程中的環境變量表中,退出后重新登錄后依然不存在。?
因此我們想要添加自己的環境變量要在上面提到的配置文件中添加。
?
上面中也給大家演示了一種錯誤:不要帶空格。
系統環境變量具有全局屬性,是會被所有的進程繼承下去的。
environ獲取環境變量
C語言中有兩個全局變量一個是error(錯誤碼)一個是environ,其中environ是一個二級指針指向環境變量表的首個字符串的地址。
1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<sys/types.h>5 #include<unistd.h>6 int main()7 {8 extern char**environ;9 int i=0;10 for(;environ[i];i++)11 {12 printf("%s\n",environ[i]); 13 14 }15 }
結合上篇文章我們就介紹了三種獲取環境變量的方式
- getenv
- main函數傳參
- environ
本地變量和環境變量的區別
- 本地變量只在bash內部有效,不會被子進程繼承下去。
- 環境變量通過讓所有的子進程繼承的方式實現全局性!
Linux的命令分類
我們誤操作環境變量后有些大部分的命令是執行不了的,這些命令就是常規命令;但是像echo命令依然可以執行,這些命令就是內建命令。
常規命令
shell創建一個子進程,讓子進程執行的。
內建命令
shell命令行的一個函數當然可以直接讀取shell內部定義的本地變量。
環境變量相關指令
- echo: 顯示某個環境變量值
- export: 設置一個新的環境變量
- env: 顯示所有環境變量
- set: 顯示本地定義的shell變量和環境變量
- unset 取消環境變量
這篇文章結合上篇文章就把Linux中命令行參數和環境變量就介紹完了;在后面的文章中我們還會再次涉及到。希望大家讀完后有很大的收獲,也可以在評論區點評文章中的內容和分享自己的看法。您三連的支持就是我前進的動力,感謝大家的支持!!!