【Linux】环境变量|查看环境变量的方法|C命令行参数
索引
- 😊看下面的一個例子
- ??基本概念在這里
- 看看默認的環境變量放在哪?
- 😊環境變量具有全局屬性的實驗
- ?如何寫一個pwd命令
- 😊通過代碼如何獲取環境變量
- 1??通過命令行的第三個參數
- Linux中的命令行參數
- ?什么是C語言的命令行參數
- 2??通過第三方變量environ獲取
- 3??通過系統調用獲取或設置環境變量(getenv)
- ??常見環境變量
- ??查看環境變量方法
- ??和環境變量相關的命令
相信大家在學習java的時候都迷迷糊糊地配置過Path環境變量。那什么是環境變量呢?
😊看下面的一個例子
下面綠色的test是一個由test.c編譯而來的可執行程序,當我們用file查看test和ls命令的時候發現他倆都是可執行程序,
那有沒有想過為什么在執行的時候test不能像ls那樣直接ls就可以執行了,偏偏要./test才可以正常執行呢?
這里可以清楚的看到,如果不帶路徑的話,會顯示命令找不到,所以說想要執行一個程序(命令)就要找到這個程序(命令)。
其實ls命令是系統自動幫我們找的,當我們也把這個test1這個文件拷貝到/user/bin/這個系統默認路徑下,那么其實也就可以執行了。
設置完了不用的話再把它從系統默認的路徑下刪除即可。
??基本概念在這里
上面介紹了這么多,接下來介紹概念的時候大家也許會更理解什么是環境變量以及環境變量的屬性。
??環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數。這種變量就是操作系統為我們提供的具有全局屬性的、往往具備特殊功能的變量。
如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。
環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性。
😊在Linux中,操作系統在啟動bash給我們做命令行解釋的時候他就必須得預先設置好一批我們未來可能要用到的變量,這批變量就叫做環境變量。
解釋:由馮諾依曼體系我們可以知道,程序(指令)運行的時候必須得先被加載到內存,原因就是因為CPU必須只能從內存里讀取代碼和數據,所以這里就出現了一個問題程序(指令)要運行起來要被加載到內存的前提條件是得先把這個二進制代碼先找到,操作系統找到之后才能加載。那么操作系統要找他就必須得在特定的路徑下去找,憑什么操作系統它會找對應的程序(指令)呢?那么其實是需要操作系統要做很多準備工作的,操作系統在啟動的時候就已經默認從我們的配置文件當中讀取了自己曾經把我們的軟件(指令)安裝到了哪些路徑下,那么操作系統安裝到了哪些路徑下,就把它記錄在配置文件里,讓操作系統啟動的時候把這個配置文件導到內存里,構建出一個內存級變量這種變量就叫做環境變量。
😊環境變量是操作系統為了滿足不同的應用場景而預先在系統內設置的一大批的全局變量,這些變量實際上在我們的整個系統中,從bash往后一直都會被進程能夠訪問到。
看看默認的環境變量放在哪?
我們cd ~,然后ls -al,就可以看到下面圈住的兩個文件
用vim打開.bash_profile,發現它內部的shell腳本大概意思是如果有.bashrc這個文件那么就啟動.bashrc這個隱藏文件。
對于~/.bash_profile比較官方的解釋是用戶級的環境配置文件,每個用戶目錄下都會具有各自的,在用戶每次登錄系統時被讀取,里面所有命令都會被shell執行。包括環境變量的配置命令。
😊環境變量具有全局屬性的實驗
對于下面代碼:
#include<stdio.h> #include<stdlib.h> #define MY_ENV "myval" int main() {char* myenv = getenv(MY_ENV);if (NULL == myenv){printf("%s, not found\n", MY_ENV);return 1;}printf("%s=%s\n", MY_ENV, myenv);return 0; }a.out是由上面的代碼編譯而來的。
1??可以發現在沒有通過export使myval變成一個全局變量(環境變量)的時候,運行a.out時發現它是找不到myval的,但是在命令行解釋器bash上可以通過echo來查看myval的值,說明此時的myval相當于是在bash的進程上的一個局部變量,局部變量只會在當前進程bash內有效。
2??使用export命令使myval變成一個全局變量(環境變量)之后,就可以發現通過運行a.out也可以找到myval的值,那么說明此時環境變量其實是具有的一個全局的屬性。
😊總結:bash是一個系統進程,a.out運行起來之后也會變成一個進程,而且a.out是bash的一個子進程,因為環境變量具有全局屬性所以會被子進程繼承下去。
?如何寫一個pwd命令
使用env命令可以看到有一個PWD這樣的系統級環境變量,用來標識當前所處的路徑。
我們用getenv來獲取環境變量。
編譯之后將可執行程序輸出到mypwd中
將mypwd拷貝到系統目錄下,我們的mypwd命令就可以用了。
😊通過代碼如何獲取環境變量
接下來給大家說一說如何去訪問環境變量的問題。
1??通過命令行的第三個參數
執行程序時,可以從命令行傳值給程序,這些值被稱為命令行參數。
Linux中的命令行參數
ls -a -l在Linux中,ls是程序,后面對應的選項-a -l就是所謂的命令行參數
?什么是C語言的命令行參數
C語言中命令行參數是使用 main() 函數參數來處理的,其中:
第一個參數 argc 是一個整型變量表示命令行參數的個數。
第二個參數 argv 是一個指針數組,里面的元素是指向命令行參數的字符指針。
第三個參數 env 是一個指針數組,里面的元素是指向環境變量(字符串)的字符指針。
下面的程序就是運用第二個參數的例子。
#include<stdio.h> #include<stdlib.h> int main(int argc, char* argv[]) {for (int i = 0; i < argc; i++){printf("argv[%d]->%s\n", i, argv[i]);}return 0; }解釋:
每個進程都會收到一張命令行參數表,命令行參數表是一個字符指針數組,最后用NULL結尾,每個指針指向一個以’\0’結尾的字符串。
運行起來之后可以看到,我們輸入的命令是./a.out -a -b,這里就自動去解析,以空格為分割,我們的程序和程序后面對應的選項就會被以字符串的形式填到argv的這個char*類型的指針數組中,然后將其打印出來,假如這里是./a.out -a -b -c,那么就會自動打印四次。
那么其實在Linux中,對于ls -al這條命令,ls也就行相當于一個程序,al相當于后面的參數和上面的./a.out -a -b -c都是類似的,由此可以推斷出Linux內部是怎樣用不同的指令,不同的選項(參數) 來實現不同的功能的。
??下面是通過命令行第三個參數來獲取環境變量的代碼。
#include <stdio.h> int main(int argc, char* argv[], char* env[]) {for (int i = 0; env[i]; i++) {printf("%s\n", env[i]);}return 0; }運行結果:
解釋:
每個進程都會收到一張環境表,環境表是一個字符指針數組,最后用NULL結尾,每個指針指向一個以’\0’結尾的環境字符串。
2??通過第三方變量environ獲取
代碼:
#include <stdio.h> int main(int argc, char* argv[]) {extern char** environ;for (int i = 0; environ[i]; i++) {printf("%s\n", environ[i]);}return 0; }C語言庫中定義的全局變量environ指向環境變量表,environ沒有包含在任何頭文件中,所以在使用時要用extern聲明。
上述兩種獲取環境變量的方法原理一樣就是不同的寫法罷了。把命令行的第三個參數的所有env寫全了,寫成environ最后結果也是一樣的。
3??通過系統調用獲取或設置環境變量(getenv)
#include <stdio.h> #include <stdlib.h> int main() {printf("%s\n", getenv("PATH"));return 0; }常用getenv和putenv函數來訪問特定的環境變量。
??常見環境變量
PATH : 系統默認的搜索路徑。通過echo命令查看它的內容,可以看到有很多的路徑,而且這些路徑都是以:分隔的。
HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統中時,默認的目錄,也就是下面的~)
SHELL : 當前Shell,它的值通常是/bin/bash。
??查看環境變量方法
echo $NAME //NAME:你的環境變量名稱
??和環境變量相關的命令
1??echo: 顯示某個環境變量值
可以發現它內部的默認路徑以:分隔。
2??export: 設置一個新的環境變量
場景一:一個可執行程序如何變成一個環境變量。
通過export可以在PATH中添加新的環境變量,做完上面的操作就可以發現test1不用帶路徑,就可以直接運行了。
場景二:在命令行解釋器(bash)上定義一個變量,通過export使它變為環境變量。
3??env: 顯示所有環境變量
4??unset: 清除環境變量
5??set: 顯示本地定義的shell變量和環境變量(使用set就會把bash命令行解釋器上定義的局部的變量和環境變量都顯示出來。)
總結
以上是生活随笔為你收集整理的【Linux】环境变量|查看环境变量的方法|C命令行参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue节日倒计时列表
- 下一篇: Conan建筑实现 —— 魔方工具