環境變量
- 一.基本概念
- 二.常見的環境變量
- 1.PATH:指令搜索路徑
- 2.HOME: 指定用戶的主工作目錄
- 3.SHELL:當前Shell,它的值通常是/bin/bash
- 三.查看環境變量的方法
- 四.命令行參數
- 五.環境變量增加和刪除
- 六.本地變量
一個問題:我們在寫一段代碼并編譯成可執行程序后,想要執行它需要加./,而在使用ls,pwd等指令時卻不需要加當前路徑,這是怎么回事呢?這就要提到環境變量了。
一.基本概念
環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性。
二.常見的環境變量
1.PATH:指令搜索路徑
查看PATH
它的內容是由一串路徑+冒號+另一串路徑+冒號+…。它用冒號作為分割符,定義出了許多路徑。那么像ls,pwd這些指令在執行時就會在PATH里挨個尋找路徑,執行正確的路徑;而我們自己的可執行程序的路徑并不在定義里,所以需要加./。
我們也可以將自己的可執行程序的路徑添加到PATH里。
2.HOME: 指定用戶的主工作目錄
查看HOME
剛登陸xshell時的目錄所處的目錄是/home/chz,為什么當一個用戶登陸時會自動到它的家目錄里呢?這是因為當你登陸xshell時,xshell會自動識別用戶,然后填充該用戶的HOME變量。
3.SHELL:當前Shell,它的值通常是/bin/bash
查看SHELL
通過$SHELL可以看到當前shell的可執行程序。
三.查看環境變量的方法
通過指令查看
通過系統接口查看
四.命令行參數
一個小知識:main函數可以帶參
第一個參數是整形,第二個參數是指針數組。argc代表argv里的元素個數。接下來打印出來看看。
main函數在用戶層面上看是入口函數,但實際上main函數并不是第一個被調用的函數,它會先被其他函數調用,而argc,argv就是傳的參。在我們看來我們輸入的是./mycmd-a但bash實際上是以空格為分隔符直接解釋成了"./mycmd" "-a"兩個字符串。再把字串的個數存入argc,每個子串的首地址保存在argv里。將字符串打散這一過程就是命令行解析。
為什么要這么做,看一段代碼
所以命令行參數有一個重要功能就是為指令提供多個選項。
main函數只有這兩個參數嗎
我們直接遍歷env[]也可以獲得全部的環境變量。并且我們可以發現這里的環境變量與env指令里的環境變量一模一樣,所以其實我們寫的程序的環境變量是繼承于父進程的。這也是為什么環境變量具有全局性。
結論:我們所運行的進程,都是子進程,bash本身在啟動的時候,會從操作系統的配置文件中讀取環境變量信息,子進程會繼承父進程交給我的環境變量!
五.環境變量增加和刪除
增加
同時在這里也可以通過執行自己寫的子程序發現子程序里的環境變量也有了MY_VALUE,進而進一步驗證了環境變量是由父進程里繼承而來的。
刪除
六.本地變量
本地變量就是我們可以直接在命令行里定義的變量
查看
set可以查看所有變量包括環境變量和本地變量
本地變量只在本BASH內部有效,不會繼承。
又一個問題:既然本地變量不能被子進程繼承,那么我們為什么可以使用echo將它打印出來呢?這其實是因為echo不需要創建子進程。