🕺作者: 主頁
我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 😘歡迎關注:👍點贊🙌收藏??留言
🏇碼字不易,你的👍點贊🙌收藏??關注對我真的很重要,有問題可在評論區提出,感謝閱讀!!!
文章目錄
- 前言
- 基本概念
- 常見環境變量
- 查看環境變量方法
- 測試PATH
- 測試HOME
- 和環境變量相關的命令
- 環境變量的組織方式
- 如何通過代碼獲取環境變量?
- 后記
前言
在我們使用Linux
命令時,我們會發現。我們執行命令并不需要帶上路徑,但是為什么我們自己寫的C語言程序,需要帶上路徑。我們怎么把我們的程序可以做得像Linux
的命令一樣,直接輸入就可以執行呢?本篇將回答這些問題,并講述相關的概念。
基本概念
-
環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。
-
環境變量通常具有某些特殊用途,還有在系統當中通常具有
全局特性
常見環境變量
PATH
: 指定命令的搜索路徑HOME
: 指定用戶的主工作目錄(即用戶登陸到Linux系統中時,默認的目錄)SHELL
: 當前Shell,它的值通常是/bin/bash。
查看環境變量方法
echo $NAME //NAME:你的環境變量名稱
測試PATH
測試代碼:
#include <stdio.h> int main(int argc, char *argv[],char *env[]) { printf("hello world!\n"); return 0;
}
對比一下./hello
執行和直接hello
執行
為什么有些指令可以直接執行,不需要帶路徑,而我們的二進制程序需要帶路徑才能執行?
比如說:ls
因為他一定在這些目錄下面:
這些指令比如說ls pwd
等都可以直接運行因為,它會直接在環境變量下搜索該命令的路徑,然后執行程序。而我們自己寫的程序并不在 PATH中,就不能不帶路徑直接執行。
我們可以怎樣讓我們的程序像Linux的指令一樣呢?
- 把我們的程序放到PATH的路徑下,但是我們并不推薦這種做法,因為它會污染別人的命令池。我們這種做法相當于安裝。
- 將我們的程序的路徑放到環境變量里。
export PATH=$PATH:[hello的路徑]
這樣我們就可以直接運行程序,而不用帶上路徑了。
測試HOME
-
用
root
和普通用戶
,分別執行echo $HOME
對比差異
-
執行
cd ~
pwd
,對應~
和HOME
的關系
和環境變量相關的命令
-
echo
: 顯示某個環境變量值
-
export
: 設置一個新的環境變量
export PATH=$PATH:[hello的路徑]
3. env
: 顯示所有環境變量
unset
: 清除環境變量set
: 顯示本地定義的shell變量和環境變量
環境變量的組織方式
每個程序都會收到一張環境表,環境表是一個字符指針數組,每個指針指向一個以’\0’
結尾的環境字符串
如何通過代碼獲取環境變量?
- 命令行第三個參數
在我們上面的hello.c程序中,我們會發現main函數有三個參數與我們之前所見括號內無參有一些區別。但事實上他們是一樣的。我們接下來依次講述三個參數的作用。
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}
首先我們看一下env
的作用。
看一下運行結果:
我們發現它就是我們之前在命令行輸入env命令時所展示的環境變量。
那么我們現在就知道它的作用了,每一個進程啟動的時候,啟動該進程傳遞給它的環境變量信息都由這個參數傳導進來。
誰導入的環境變量?
答案是通過從父進程那里繼承下來的。默認情況下,所有的環境變量都會被子進程繼承,環境變量具有全局屬性,但是所有的父進程都有它的父進程,最終的父進程就是bash。bash的環境變量從哪來呢?操作系統?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}
直接查看,發現沒有結果,說明該環境變量根本不存在
- 導出環境變量
export MYENV="hello world"
- 再次運行程序,發現結果有了!說明:環境變量是可以被子進程繼承下去的!
**還有什么獲取環境變量的方式嗎?**有的(environ、getenv
函數等)
通過第三方變量environ
獲取
#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
libc中定義的全局變量environ
指向環境變量表,environ
沒有包含在任何頭文件中,所以在使用時 要用extern
聲明。
我們再來看第1和第2個參數。
測試代碼如下:
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(int i=0; i<argc; i++){printf("argv[%d]:%s\n",i,argv);}return 0;
}
測試結果:
argv[0]:"./hello"
argv[1]:"-ls"
argv[2]:"-a"
argv[3]:"-b"
我們會發現argv存儲啟動程序的選項。
命令行參數最大的意義是讓我們同樣一個程序通過選項的方式可以使用同一個程序的不同的子功能,這就是選項的意義,即這些所有的命令后面所帶,選項底層都是用命令行參數完成的。
后記
本篇我們主要講述了什么是環境變量以及怎么設置環境變量?還有查看環境變量的方法。與環境變量相關的命令,環境變量的組織方式。最后還講述了如何通過代碼來獲取環境變量。