【Linux系統】Linux環境變量:系統配置的隱形指揮官

。# Linux系列


文章目錄

  • 前言
  • 一、環境變量的概念
  • 二、常見的環境變量
  • 三、環境變量特點及其相關指令
    • 3.1 環境變量的全局性
    • 3.2、環境變量的生命周期
  • 四、環境變量的組織方式
  • 五、C語言對環境變量的操作
    • 5.1 設置環境變量:setenv
    • 5.2 刪除環境變量:unsetenv
    • 5.3 遍歷所有環境變量:environ


前言

環境變量是操作系統和用戶設置的一些動態鍵值對,為運行的程序提供配置信息。理解環境變量對于系統管理、軟件開發都很重要。


一、環境變量的概念

環境變量是操作系統用來存儲和傳遞與系統環境相關信息的一種機制,是以鍵值對形式定義的全局變量,供操作系統和應用程序讀取和使用。
通常格式為:
當VALUE為多個時,以‘:’符號隔開

KEY=VALUE
  • KEY:變量名
  • VALUE:對應值

那么它究竟有什么作用呢?我們來看這個例子:
在這里插入圖片描述
從上面我們可以看到存在一個可執行程序test,第一次我們執行它,程序并沒有正常運行,當然都知道因為沒有指定程序所在路徑,所以程序不能正常運行,第二次指定了不就運行成功了,那么我們的指令在執行時為什么不用指定路徑呢?在指令篇我們就介紹過,指令的本質就是一個寫好的可執行程序,當時我們說,如果我們想要讓自己寫的,可執行程序,像指令一樣直接運行,我們可以將程序拷貝到指令所在路徑下:/usr/bin
那還是沒有解釋為什么指令可以直接運行,或者說bash是如何找到指令的可執行程序的呢?還有沒有其他方法可以使我們的可執行程序像指令一樣運行呢?接下來我們來認識一下本篇第一個環境變量:PATH
PATH是操作系統中最核心的環境變量之一,當我們在命令行輸入一個命令時,操作系統會按照PATH中定義的目錄依次搜索該命令對應的可執行文件,若未找到該命令對應的可執行文件就會提示:command not found
查看PATH

echo $PATH

在這里插入圖片描述PATH環境變量對應多個值,使用“:"隔離開

所以當我們將自己寫的可執行文件,拷貝到/usr/bin路徑下,系統在PATH對應的目中就可以找到。
還有什么方法可以解決這里的問題呢?只需要將我們自己寫的可執行程序所在路徑添加到PATH環境變量中,不就也可以完成搜索了

PATH=$PATH:/home/ltn/dir

在這里插入圖片描述
在這里插入圖片描述
剛才的test于前面路徑存在的,可執行程序重名了,所以又換了個程序給大家演示,但這恰恰說明了系統是從第一個路徑向后搜索程序的。

我們使用which查找指令時,就是在PATH環境變量中搜索的,所以現在我們就可以像查找指令一樣查找我們自己的可執行程序了。
在這里插入圖片描述

二、常見的環境變量

環境變量… 作用對應VALUE
HOME當前用戶的主目錄路徑/home/ltn
USER當前登錄用戶名ltn
PWD當前工作目錄路徑/home/ltn
HISTSIZE記錄歷史指令最大數10000

查看環境變量:

查看所有環境變量:
env
查看指定環境變量:
echo $環境變量名

僅是截取的一部分
在這里插入圖片描述

三、環境變量特點及其相關指令

為了方便接下來的講解,我先帶大家認識一個關于環境變量的系統調用接口:
在這里插入圖片描述
頭文件:#include<stdlib.h>
參數:環境變量名
返回值:如果存在則返回一個指向環境變量名的指針,否則返回NULL

3.1 環境變量的全局性

環境變量最開始是在我們登錄xshell時,操作系統給bash形成的,當我們執行某些指令時,bash會創建子進程,并且將環境變量繼承下來(當然會做某些修改),簡單來說:環境變量是子進程從父進程那里繼承下來的。
接下來我們驗證一下!!!
創建我們自己的環境變量:

export ltn =”1234“

在這里插入圖片描述
我們在當前bash進程定義了一個環境變量,如果子進程會繼承父進程的環境變量,則可以打印出結果,否則程序什么都不輸出。

  1 #include<stdio.h>  2 #include<unistd.h>  3 #include<stdlib.h>  4 int main()  5 {  6   printf("子進程的ltn->%s\n",getenv("ltn"));                                                                                      7   return 0;                                           8 }

在這里插入圖片描述
可以看到程序成功打印,所以子進程會繼承父進程的環境變量。

3.2、環境變量的生命周期

  • 環境變量的生命周期與進程綁定
  • 進程終止時,環境變量也會被回收

正是有了繼承的這種形式,我們之前所提到的權限概念,才會被每條指令遵守。
刪除環境變量:

unset ltn

在這里插入圖片描述

四、環境變量的組織方式

我們之前在學習的C語言,不知道你有沒有聽過main函數的參數:

int main(int argc, char *argv[], char *env[])

第三個參數我們先不驗證

  1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main(int argc, char *argv[], char *env[])5 {6   int i=0;7   for(;i<argc;i++)8   {9     printf("argv[%d]->%s\n",i,argv[i]);                                                                                           10   }11   return 0;12 }    

這樣一段代碼,當我們執行它時,結果會怎么樣呢?
在這里插入圖片描述
在這里插入圖片描述
可以看到我們以上面兩種不同的方式執行,程序打印出了兩種不同的結果,要知道怎么會這樣,我們還是要知道參數是什么意思:

參數一 argc

  • 作用:記錄命令行參數的數量
  • 規則:
  • 1、argc的值至少為1,因為第一個參數始終是程序自身的名稱。
  • 2、用戶輸入的每個參數(以空格分隔)都會增加argc的值。

參數二 argv

  • 作用:存儲命令行參數的具體值(用空格分開的代表不同參數),以字符串數組的形式表示
  • 規則:
  • 1、argv[0] 是程序名稱(可能包含路徑,取決于調用方式)。
  • 2 、argv[1]argv[argc-1] 是用戶輸入的參數。
  • 3、 argv[argc] 是一個空指針(NULL),表示數組結束。

參數三、env

  • 作用:指向系統的環境變量數組(從bash那繼承的),每個元素是 KEY=VALUE 格式的字符串。

  • 規則

  • 1、 環境變量數組以 NULL 結尾。

  • 2、可以通過 getenv() 函數更安全地獲取特定環境變量。

當知道了main函數的這些參數,我們就可以理解,為什么同一個指令加上不同的選項會有不同的功能了:當你在執行指令是帶上不同參數,它就會存入到argv數組中,然后通過if else語句匹配不同代碼塊。實現不同功能。

五、C語言對環境變量的操作

5.1 設置環境變量:setenv

在這里插入圖片描述
頭文件:#include<stdlib.h>
參數:

  1. name:設置的環境變量名
  2. value:設置的環境變量值
  3. overwrite:是否覆蓋已有值(非零表示覆蓋)

示例:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main(int argc, char *argv[], char *env[])5 {6   if(setenv("ltn","Hell Linux",0)==0);7   {8     printf("ltn set to->%s\n",getenv("ltn"));                                                                                   9 10   }11   return 0;12 }

在這里插入圖片描述

5.2 刪除環境變量:unsetenv

在這里插入圖片描述

頭文件:#include<stdlib.h>
參數:

  1. name:環境變量名

示例:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main(int argc, char *argv[], char *env[])5 {6   if(setenv("ltn","Hell Linux",0)==0);7   {8     printf("ltn set to->%s\n",getenv("ltn"));9 10   }11   unsetenv("ltn");                                                                                                              12   printf("ltn->%s\n",getenv("ltn"));                                                                       13   return 0;                                                                                                14 }  

在這里插入圖片描述
創建好,并刪除

5.3 遍歷所有環境變量:environ

在這里插入圖片描述
environ是一個全局變量,內部存有所有環境變量的指針,,末尾指針指向NULL,具體介紹太長,不方便展示,大家可以自己看。
示例:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 extern char**environ;
W>  5 int main(int argc, char *argv[], char *env[])6 {7   char **env1=environ;8   while(*env1)9   {10     printf("%s",*env1);11     env1++;                                                                                                                     12   }13 14   return 0;15 }

在這里插入圖片描述
僅截取部分打印結果
下面我們來說一下第三給參數,第三參數,是一個環境變量數組,也就是說,我們可以通過直接變量得到全部環境變量:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 extern char**environ;5 int main(int argc, char *argv[], char *env[])6 {7   int i=0;8   while(env[i])9   {10     printf("%s\n",env[i]);11     i++;                                                                                                                        12   }13 14   return 0;15 }

在這里插入圖片描述
本篇就先到這里,看完給個三連吧!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86391.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring AI中使用ChatMemory實現會話記憶功能

文章目錄 1、需求2、ChatMemory中消息的存儲位置3、實現步驟1、引入依賴2、配置Spring AI3、配置chatmemory4、java層傳遞conversaionId 4、驗證5、完整代碼6、參考文檔 1、需求 我們知道大型語言模型 &#xff08;LLM&#xff09; 是無狀態的&#xff0c;這就意味著他們不會保…

Java 高級泛型實戰:8 個場景化編程技巧

文章目錄 一、通配符高級應用&#xff1a;靈活處理類型關系二、泛型方法與類型推斷三、泛型類的嵌套使用四、受限泛型與邊界條件五、泛型與反射結合六、泛型在函數式接口中的應用七、類型擦除與橋接方法八、自定義泛型注解總結 在Java編程中&#xff0c;泛型不僅是類型安全的保…

[藍橋杯 2024 國 B] 立定跳遠

問題描述 在運動會上&#xff0c;小明從數軸的原點開始向正方向立定跳遠。項目設置了 n 個檢查點 a1,a2,...,an且 ai≥ai?1>0。小明必須先后跳躍到每個檢查點上且只能跳躍到檢查點上。同時&#xff0c;小明可以自行再增加 m 個檢查點讓自己跳得更輕松。在運動會前&#xf…

2025年全國I卷數學壓軸題解答

第19題第3問: b b b 使得存在 t t t, 對于任意的 x x x, 5 cos ? x ? cos ? ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx?cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min ? t max ? x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…

wpf在image控件上快速顯示內存圖像

wpf在image控件上快速顯示內存圖像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在尋找能夠快速在image控件刷新大圖像&#xff08;比如分辨率3000*3000的圖像&#xff09;的辦法&#xff0c;尤其是想把內存中的裸數據&#xff08;只有圖像的數據&#xff0c;不包…

解決網頁導出PDF部分內容被遮擋問題

問題描述 以學習通為例&#xff0c;在使用CtrlP打印頁面或截圖時&#xff0c;固定側邊欄會遮擋部分內容&#xff0c;影響完整內容的獲取。如下圖所示&#xff1a; 解決辦法 通過瀏覽器開發者工具臨時移除固定側邊欄&#xff0c;具體步驟如下&#xff1a; 在目標頁面右鍵點…

機器學習監督學習實戰六:五種算法對新聞組英文文檔進行文本分類(20類),詞頻統計和TF-IDF 轉換特征提取方法理論和對比解析

本文主要介紹了20 Newsgroups數據集及其在文本分類任務中的應用。20 Newsgroups數據集包含約20,000篇新聞組文檔&#xff0c;分為20個不同主題的新聞組&#xff0c;數據集被分為訓練集和測試集。在數據預處理階段&#xff0c;使用了CountVectorizer和TfidfVectorizer兩種方法將…

易學探索助手-個人記錄(十四)

項目背景 在大語言模型&#xff08;LLM&#xff09;完成指令微調&#xff08;SFT&#xff09;之后&#xff0c;雖然可以處理開放式問答任務&#xff0c;但在專業領域&#xff08;如《周易》&#xff09;仍面臨知識更新滯后、事實性薄弱等問題。為此&#xff0c;本文介紹如何通…

從“人找政策”到“政策找人”:智能退稅ERP數字化重構外貿生態

離境退稅新政核心內容與外貿企業影響 &#xff08;一&#xff09;政策核心變化解析 退稅商店網絡擴容 新政明確鼓勵在大型商圈、旅游景區、交通樞紐等境外旅客聚集地增設退稅商店&#xff0c;并放寬備案條件至納稅信用M級企業。以上海為例&#xff0c;靜安區計劃新增1000家退…

Pandas 可視化集成:數據科學家的高效繪圖指南

為什么選擇 Pandas 進行數據可視化&#xff1f; 在數據科學和分析領域&#xff0c;可視化是理解數據、發現模式和傳達見解的關鍵步驟。Python 生態系統提供了多種可視化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 內置的可視化功能因其與數據結…

曼昆《經濟學原理》第九版 第十一章公共物品與公共資源

一、物品分類的基本框架 排他性&#xff1a;能否阻止他人使用該物品的特性競爭性&#xff1a;一個人使用是否減少他人使用的特性 根據這兩個特性可將物品分為四類&#xff1a; 私人物品&#xff1a;既有排他性又有競爭性&#xff08;如冰淇淋、衣服&#xff09;公共物品&…

基于大模型預測原發性急性閉角型青光眼的技術方案研究大綱

目錄 一、引言二、技術方案概述三、術前階段(一)數據采集與處理(二)大模型預測(三)手術方案制定(四)麻醉方案確定(五)術前健康教育四、術中階段(一)實時數據監測與輸入(二)手術策略動態調整(三)并發癥預警與處理(四)術中健康教育五、術后階段(一)恢復監測與…

基于React 的 AntD 庫進行前端開發過程中的問題匯總

背景 最近寫了半個月的 React 前端&#xff0c;三年沒寫過 React 前端了&#xff0c;有些生疏了&#xff0c;匯總一下 基于React 前端的 antD 庫編寫過程中的低級問題吧。 PS 一下&#xff0c;半個月沒有發布博客了&#xff0c;C站產品經理又悄默默地改了樣式&#xff0c;博客…

Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任務調度框架全景對比

引言 從單機定時任務到分布式工作流調度&#xff0c;不同場景需要選擇匹配的調度框架。 本文對比 Spring Scheduled、XXL-JOB、DolphinScheduler &#xff08;海豚調度器&#xff09;和 Apache Airflow 的核心差異&#xff0c;助你避免過度設計或功能不足。 一、核心定位與適用…

springMVC-10驗證及國際化

驗證 概述 ● 概述 1. 對輸入的數據(比如表單數據)&#xff0c;進行必要的驗證&#xff0c;并給出相應的提示信息。 2. 對于驗證表單數據&#xff0c;springMVC提供了很多實用的注解, 這些注解由JSR303 驗證框架提供. ●JSR 303 驗證框架 1. JSR 303 的含義 JSR&#xff0…

OpenCV 滑動條調整圖像對比度和亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

ReadWriteLock(讀寫鎖)和 StampedLock

1. ReadWriteLock&#xff08;讀寫鎖&#xff09;&#xff1a;實現高性能緩存 總結&#xff1a; 要點 內容 適用場景 讀多寫少、高并發讀取場景&#xff08;如緩存&#xff09; 鎖類型 ReadWriteLock接口&#xff0c;ReentrantReadWriteLock實現 讀鎖 vs 寫鎖 多線程可…

【決勝公務員考試】求職OMG——見面課測驗1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答題&#xff0c;大家注意呀&#xff01; 博主碼字不易點個關注吧,祝期末順利~~ 1.單選題(2分) 下列說法錯誤的是:&#xff08; B &#xff09; A.選調生屬于公務員系統 B.公務員屬于事業編 C.選調生有基層鍛煉的要求 D…

vue3 el-button 自定義本地圖標

設置不生效的原因可能有&#xff1a;1.style標簽里沒加scoped <style scoped></style>2.本地圖片路徑指向錯誤3.自定義圖片長寬沒設置4.deep深度選擇器使用錯誤&#xff0c;vue3用:deep() <el-tooltip content"重新匹配" placement"top"&g…

如何在最短時間內提升打ctf(web)的水平?

剛剛刷完2遍 bugku 的 web 題&#xff0c;前來答題。 每個人對刷題理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟著writeup做了一遍就等于刷了&#xff0c;還有的人是獨立思考做了一遍就等于刷了。…