【Linux倉庫】命令行參數與環境變量【進程·伍】

🌟?各位看官好,我是egoist2023!

🌍?Linux == Linux is not Unix !

🚀?今天來學習命令行參數與環境變量的相關知識。

👍?如果覺得這篇文章有幫助,歡迎您一鍵三連,分享給更多人哦!

目錄

命令行參數

意義

環境變量

羅列Linux環境變量

PATH

OLDPWD

PWD

多方法獲取環境變量

main函數獲取

?編輯

getenv獲取

environ獲取

?編輯

我的進程如何獲取環境變量?

環境變量全局屬性

內建命令


命令行參數

main函數可以有參數嗎?可以有幾個參數呢?參數又是什么呢?帶著這三個疑問往下閱讀。

int main(int argc,char *argv[])
{printf("hello linux!\n");return 0;
}

我們或多或少在別人的程序中見過這種代碼,清楚main函數是可以帶參數的,并且可以有兩個參數(實際上可以有3個參數,第3個是環境變量表)。那么這兩個參數各代表什么含義呢?

  • argv是一個指針數組,它指向一個一個的字符串,最后以NULL結尾;
  • argc用來記錄argv[]的元素個數。

我們的命令行參數會放到命令行參數表上,即argv,它用來存儲命令行參數的每個單獨的字符串。


意義

為什么要有命令行參數表呢?它能帶來的意義又有哪些呢?

  1. 命令行參數傳遞:借助主函數的參數,能把命令行中用戶輸入的參數傳遞到程序內部,這樣程序就能依據不同參數執行不同操作。
  2. 程序靈活性提升:無需對代碼進行修改,通過命令行參數就能改變程序的運行方式或者配置信息。

從這兩方面我們并不能體會到啊?因此小編寫了段程序解釋命令行參數帶來的意義:

下圖中寫了一段程序,它借助main函數參數,讓命令行參數傳遞的時候,通過匹配不同的命令行參數,如果第二個參數帶的是v1則實現v1版本,帶的是v2則實現v2版本,從而實現不同版本的邏輯,這帶來的意義就是命令行參數傳遞實現不同的邏輯,同時我們也可以限制如果傳遞的命令行參數不符合我們的邏輯,則不能通過,提升了程序靈活性。

?💻如圖實現:?

有沒有一種可能我們之前所說的選項就是這樣實現的呢?

是的沒有錯,Linux中許多指令也是借助了命令行參數才得以支持多模塊實現,如ls指令。

ls -l -a -i

?ls的命令本質是一個程序,而我們之前說ls后面的是選項,今天我們對選項能有更深的理解,它是通過命令行參數匹配從而實現我們的目的。

-l 、 -a 本質是字符串,以一定的方式傳遞給ls內部的"main",在ls內部實現的時候,就可以根據不同的選項,實現類似功能的不同表現形式。

因此我們對指令又有了進一步的理解:指令是特定目錄上執行的二進制程序,而選項則是根據不同的參數傳遞給"main",實現不同表現形式.


環境變量

引出概念:

  • 環境變量(environment variables)?般是指在操作系統中?來指定操作系統運?環境的?些參數如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪?,但是照樣可以鏈接成功,?成可執?程序,原因就是有相關環境變量幫助編譯器進行查找。
  • 環境變量是系統級別的一些全局變量,具備不同的用途(這也是為什么要有環境變量的原因)。

羅列Linux環境變量

那么該如何查看環境變量呢?

env 可以用來查看環境變量 , 這里主要講三個重要的環境變量:PATH、OLDPWD、PWD.

??

  • PATH : 指定命令的搜索路徑
  • HOME : 指定用戶的主?作?錄(即??登陸到Linux系統中時,默認的?錄)
  • SHELL : 當前Shell,它的值通常是/bin/bash。

PATH

我們前面說過,指令也是一個可執行程序。為什么有些指令可以直接執?,不需要帶路徑,?我們自己的?進制程序需要帶路徑才能執行啊( 否則會報找不到 )這是為什么呢?

通過which命令查看ls所處的路徑,可以看到是在/usr/bin的路徑下。 什么意思呢 ? 即OS要執行該指令時,就需要/usr/bin路徑,那么由誰給它提供呢 ? OS默認會在PATH路徑下查找,若沒有則會報錯。而/usr/bin被包含在PATH環境變量中。

  1. 因此我只要證明 /usr/bin 不在PATH中時,此時再使用 ls 指令會向我們執行自己的程序一樣報沒有找到 ;
  2. 或者將我們自己的程序添加到PATH中,再執行自己的程序,若不會報錯, 即可證明OS是在PATH中查找的。?

?

💻擴展:

PATH的環境變量改變了,該怎么進行復原呢?重啟xshell即可,因為環境變量是內存級的。?

OLDPWD

OLDPWD環境變量用來記錄當前用戶最近一次所處路徑。

💻證明: echo $OLDPWD可以展示最近一次所處路徑.

??

PWD

這里總算可以解釋pwd指令的原理了:

我們知道每個進程(包括xshell啊!)都會記錄自己所處的工作路徑,這在之前是已經驗證過的.那么我們的PWD環境變量又從哪里而來呢??

pwd 會讀取 當前進程所處的cwd.

💻pwd指令原理:

當你在 shell?里輸入?pwd,其實是啟動了一個新的進程,它繼承了父進程(你的 shell)的 cwd 。pwd 進程通過系統調用(如?getcwd())讀取自己的?cwd,然后把它打印出來。由于?pwd?進程和你的 shell 進程的 cwd 是一樣的,所以你看到的就是你當前 shell 所在的目錄。


多方法獲取環境變量

獲取環境變量的方法有很多,這里主要介紹三種:

main函數獲取

我們前面說了main函數是可以帶3個參數的,而第3個參數則是環境變量表.下圖中

💻模擬實現env指令:


getenv獲取

getenv是C語言庫提供的函數,它可以用來獲取單個環境變量


environ獲取

libc中定義的全局變量environ指向環境變量表,environ沒有包含在任何頭?件中,所以在使?時 要?
extern聲明。(實際上environ就是個二級指針,指向環境變量表)


我的進程如何獲取環境變量?

我們大部分的指令以及自己實現的可執行程序,都不是有bash幫我們執行的,而是bash通過創建子進程的方式,讓子進程繼承了bash的環境變量,形成環境變量表。

問題1:為什么子進程可以繼承bash的環境變量?

環境變量表是數據嗎?是數據,并且是父進程的數據。子進程通常會繼承父進程的代碼和數據為副本,因此可以繼承bash的環境變量。

問題2:bash從哪里獲得環境變量的?

bash從系統的配置文件中獲取,先會malloc環境變量表,解析配置文件的內容,把環境變量字符串依次放入到環境變量表里。

那么這就意味著bash一定會有兩張表:

命令行參數表(一直在變)+ 環境變量表(比較穩定,內存級)

💻驗證:

我們可以更改配置文件的信息,寫入一段echo "哈哈,這個配置文件被執行了" 。則每次啟動xshell時,bash都會從這個配置文件中形成環境變量表,在顯示器上打印我們寫入的信息。

??

輸出結論:bash獲取環境變量有兩方面:配置文件 + 動態形成。?

環境變量全局屬性

  • echo:顯示某個環境變量值
  • export: 設置?個新的環境變量
  • unset: 清除環境變量
  • set: 顯?本地定義的shell變量和環境變量

環境變量是具有全局屬性的,可以被子進程繼承下去;

相對應的本地變量是不具備全局屬性的,這種變量是不能被子進程繼承。

💻下圖中證明本地變量是不可以被子進程所繼承的:

MYENV是本地變量,執行程序時bash創建子進程,子進程以父進程為副本進行繼承,包括環境變量.假設本地2變量可以被繼承下去,那么getenv獲取該變量,如果打印該變量不存在說明本地變量是不能被繼承下去的.

?

內建命令

我們知道命令是可執行程序,其中的大部分命令需要通過創建子進程的性質執行。

那么肯定也存在一些命令是不需要通過創建子進程來執行,而是由bash來執行.那么這個命令在執行的時候是沒有風險的.我們把這種命令叫做內建命令!!!?

💻echo 指令: 無論是本地變量還是環境變量,echo都能顯式變量值。

我們說本地變量是不能被子進程繼承下來的,說?明本地變量只在bash自?身有效,如果能打印出該變量的值,恰恰說明echo指令是一個內建命令。??

??


?

?

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

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

相關文章

R 數據框:深入解析及其在數據分析中的應用

R 數據框:深入解析及其在數據分析中的應用 引言 R語言作為一種強大的統計計算和圖形工具,在數據分析領域有著廣泛的應用。數據框(DataFrame)是R語言中處理數據的一種重要結構,它類似于其他編程語言中的表格或關系數據庫中的表。本文將深入解析R數據框的概念、特點、創建…

機器學習數據集劃分全指南:train_test_split詳解與實踐

目錄 一、為什么需要劃分數據集? 二、train_test_split基礎用法 2.1 最簡單的劃分方式 2.2 參數說明 三、實際應用案例:Iris數據集劃分 四、高級技巧與注意事項 4.1 分層抽樣(Stratified Sampling) 4.2 時間序列數據劃分 …

python-77-數據序列化框架Avro數據格式編碼和解析

文章目錄 1 avro簡介1.1 關鍵特點1.2 無需標記2 使用步驟2.1 定義Avro模式2.2 編碼Avro數據2.3 解析Avro數據3 DataFileWriter和DataFileReader3.1 寫入DataFileWriter3.2 讀取DataFileReader3 文件中存儲16進制字符串3.1 十六進制字符串3.2 代碼示例4 接收kafka中的avro數據5 …

IAR攜手矽力杰與普華基礎軟件,共推RISC-V車規芯片高安全應用落地

芯片 基礎軟件 開發工具三方協同,賦能國產汽車電子加速自主演進 在“軟件定義汽車”持續重塑產業格局的當下,構建安全、高效、可擴展的本土汽車電子生態已成為行業共識。 IAR嵌入式開發解決方案現已全面支持矽力杰SA32B系列和即將量產的SA32D系列車規…

Vscode——報錯,加載 Web 視圖時出錯: Error: Could not register service worker

Vscode——報錯完整信息 加載 Web 視圖時出錯: Error: Could not register service worker: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state… 很有意思下班前還是好的,上班發現下載的Ai code 無法正常使用了 解決…

Java-Collections、Map

目錄 1.可變參數 2.Collections工具類 不同集合類型的排序方法比較 3.斗地主游戲 4.Map集合 4.1 Map集合概述 4.2 Map集合的常用方法 4.3 Map集合的遍歷方式 4.4 Map集合案例—統計投票人數 4.5 HashMap 4.6 LinkedHashMap 4.7 TreeMap 5.集合的嵌套 1.可變參數 import …

開源界迎來重磅核彈!月之暗面開源了自家最新模型 K2

1. 模型簡介 Kimi K2 是一款尖端專家混合(MoE)語言模型,激活參數量達320億,總參數量突破1萬億。該模型采用Muon優化器訓練,在前沿知識、推理和編程任務中展現出卓越性能,同時針對智能體能力進行了精細化優…

Grok-4 發布會圖文總結

文章目錄00:00 - Grok-4:以“全球最智能 AI”之名突破性登場06:41 - 推理能力的大幅飛躍:100 倍訓練量鑄就的“博士級”大腦13:25 - 工具使用能力的革新:從“原始”到深度整合20:06 - 直面強化學習的挑戰與 AI 的終極測試26:45 - 應用演示&am…

AI產品經理面試寶典第1天:機器學習核心算法全景解析

面試官:請解釋什么是監督學習?能否用生活案例說明其運作邏輯? 監督學習如同教孩子識字的過程。父母指著"蘋果"圖片反復說"這是蘋果"(帶標簽的訓練數據),孩子逐漸建立"紅色圓形水果=蘋果"的認知模型(算法生成)。當孩子看到新圖片時,模型…

前端開發技術棧概覽

前端開發技術棧概覽 前端開發是創建Web頁面或app等前端界面給用戶的過程,從簡單的靜態頁面到復雜的單頁應用(SPA),前端技術棧經歷了快速的演進。以下是前端開發所需掌握的核心技術分類及相關知識點: 1. 基礎層:HTML、CSS、JavaScr…

詳解Kafka通過冪等性實現分區消息不重復的機制

一、核心機制:PID與序列號1. Producer ID (PID)唯一標識:每個生產者實例啟動時,由Kafka Broker分配一個全局唯一的PID,用于標識消息來源。持久化存儲:PID由Broker持久化保存,確保生產者重啟后仍能追蹤歷史狀…

壓縮包方式在centos7版本上安裝mysql8.0

使用tar命令解壓 tar -zxvf mysql-8.0.32-el7-x86_64.tar.gz -C /usr/local/到/usr/local/修改解壓后的文件名為mysql 創建mysql用戶組和用戶,自己在mysql下面創建data目錄存儲信息,把權限交給mysql這個用戶 groupadd mysql useradd -r -g mysql mysql c…

使用ansible給被管理節點安裝docker

在跳板機上安裝ansible,再通過ansible的playbook,給被管理節點安裝docker。 跳板機配置 實驗環境 華為云上按需開兩臺2核2G的Ubuntu的ECS;2臺公網IP為5Mbit/s,按需按流量;2臺服務器在一個子網內;跳板機和被管理節點主機分別掛不通的安全組 在…

《Java EE與中間件》實驗三 基于Spring Boot框架的購物車

目 錄 一、實驗目的和要求 二、實驗實現思路及步驟 1、實驗思路 2、實驗步驟 3、實驗方案 三、主要開發工具 四、實驗效果及實現代碼 1、購物車數據庫構建實現 (1)建立javaee-project數據庫 (2)建立t_cart數據表 &…

DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 論文精讀

題目:DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 題目:DAS3D:用于三維異常檢測的雙模態異常合成 論文地址:ECCVW 2024 2410 Dual-modality 雙模態 Anomaly Synthesis 異常合成 for 3D Anomaly Detection…

EasyCVR視頻匯聚平臺國標接入設備TCP主動播放失敗排查指南

部分客戶現場的下級平臺通過國標級聯接入安防監控系統EasyCVR后,只能通過TCP主動的播放方式進行播放(并不是所有下級平臺都支持tcp主動播放,模式需下級平臺支持),但是有些平臺剛接入的時候發現不能播放。核心原因分析&…

linux打包指令和移動指令

在Linux中,常用的文件夾打包命令是 tar,它可以將文件夾壓縮打包成 .tar、.tar.gz、.tar.bz2 等格式的文件。以下是具體用法: 1. 基礎打包(不壓縮,生成 .tar 文件) 將文件夾 folder 打包為 folder.tar&#…

神經符號AI:結合深度學習和符號邏輯的下一代AI

神經符號AI:結合深度學習和符號邏輯的下一代AI當AI醫生解釋診斷時,它不僅能指出醫學影像中的異常像素模式,還能引用臨床指南中的第三條第二款,推演病理發展的邏輯鏈條——這正是神經符號AI賦予機器的“理性之光”。2025年初&#…

SpringBoot JWT

jsonwebtoken 引依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency> 測試一下&#xff0c;jwt是2個帶逗號的3段字符串 官網參考&#xff1a;JSON …

讀取QPS 10萬,寫入QPS 1000,如何設計系統架構?

你是否也曾深陷在臃腫的領域模型&#xff08;Domain Model&#xff09;的泥潭&#xff0c;一個 User 或 Order 實體類&#xff0c;既要處理復雜的業務邏輯和數據校驗&#xff0c;又要承載各種為前端展示而生的DTO轉換&#xff0c;導致模型越來越胖&#xff0c;讀寫性能相互掣肘…