《命令行參數與環境變量:從使用到原理的全方位解析》

前言

? ? ? ?當我們在終端輸入 ls -l /home 查看目錄詳情,或用 gcc -o hello hello.c 編譯代碼時,或許很少思考:這些空格分隔的 “指令 + 選項 + 路徑” 是如何被程序識別的?為什么 PATH 變量能讓系統找到可執行文件,而 HOME 變量總能指向用戶主目錄?命令行參數與環境變量,作為用戶與程序、程序與系統之間溝通的 “橋梁”,是理解程序運行機制的基礎。

? ? ? ? 本文將從最直觀的使用場景出發,帶你系統梳理這兩大核心概念:先解析命令行參數的結構 —— 以 ls -l、gcc -o 等經典命令為例,講清參數的傳遞邏輯與程序如何接收處理;再深入環境變量的世界,從查看方法(如 echo $PATH)、核心命令(如 export、env),到其 “全局屬性” 的本質,最后通過代碼實例演示如何在程序中獲取環境變量(無論是借助 environ 變量還是系統調用)。

? ? ? ?無論你是剛接觸終端的初學者,還是想搞懂程序啟動時參數與環境如何傳遞的開發者,這篇文章都將幫你打通從 “會用” 到 “理解原理” 的鏈路,讓每一次命令輸入都知其然更知其所以然。

目錄

基本概念

命令行參數

🧱 命令行參數結構

? 示例講解

1. ls -l /home

2. gcc -o hello hello.c

3. rm -rf myfolder/

🔍 如何查看命令的可用參數?

常見環境變量

查看環境變量方法

和環境變量相關的命令

環境變量的組織方式

環境變量獲取方式

通過代碼獲取環境變量

通過第三方變量environ獲取

通過系統調用獲取環境變量

環境變量通常是具有全局屬性的


基本概念

1.環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數。

例如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪

里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。

2.環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性。

命令行參數

讓一個程序可以通過選項實現不同的子功能。

main函數的命令行參數,是實現程序不同子功能的方法!!!!———指令選項的實現原理。

main有參數嗎,實際上是有的。

?#include <stdio.h> int main(int argc,char*argv[]){for(int i=0;i<argc;i++){printf("argc[%d]:%s\n",i,argv[i]); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }return 0;}

上述結果bash會把我們的命令拆分成五個部分 ./code 1 2 3 4 ,放到一個argv表中,用來支持選項功能。

在 Linux 中,命令行參數是在終端中運行一個命令時,傳遞給該命令的附加信息。命令行參數通常用于:

  • 指定行為(例如:-l 表示長格式)

  • 提供文件名或路徑

  • 設置選項或標志


🧱 命令行參數結構

?command [options] [arguments]
  • command:要執行的命令

  • options(或 flags):修改命令行為,通常以 --- 開頭,如 -l--help

  • arguments:傳遞給命令的數據,比如文件名、路徑等


? 示例講解

1. ls -l /home
  • ls:列出文件/目錄

  • -l:使用長格式輸出

  • /home:指定目錄

輸出:以詳細列表方式顯示 /home 目錄的內容。


2. gcc -o hello hello.c
  • gcc:GNU C 編譯器

  • -o hello:輸出文件名為 hello

  • hello.c:輸入的源代碼文件


3. rm -rf myfolder/
  • rm:刪除文件或目錄

  • -r:遞歸刪除(包括子目錄)

  • -f:強制刪除(不提示)

  • myfolder/:要刪除的目錄


🔍 如何查看命令的可用參數?

使用 --help 或查看手冊頁:

?command --helpman command

例如:

?ls --helpman rm

常見環境變量

? PATH : 指定命令的搜索路徑

? HOME : 指定用戶的主功能工作目錄(即用戶登陸到Linux系統中時,默認的目錄)

? SHELL : 當前Shell,它的值通常是/bin/bash。

我們要執行一個程序時,首先要找到它的位置,誰找呢?bash來找,通過環境變量來找,系統中存在環境變量,來幫助找到目標二進制文件。

bash會拿到兩張表,一張環境變量表,一張命令行參數表,一起使用。

查看環境變量方法

echo $NAME //NAME:你的環境變量名稱

測試PATH

  1. 創建hello.c?件

    ?#include <stdio.h>?int main() {printf("hello world!\n");return 0;}
    

    2.對比 ./hellohello 執行


  1. 為什么有些命令可以直接執行,而自己的程序需要帶路徑?

Linux 執行命令時,不會自動在當前目錄查找命令,而是按順序在 PATH 環境變量中定義的目錄里查找。

你可以查看當前的 PATH:

?echo $PATH

輸出類似:

?/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

所以:

  • 比如 ls 位于 /bin/ls,由于 /bin 在 PATH 中,ls 可以直接運行。

  • 而當前目錄 ./ 不在 PATH 中,所以你的 hello 無法直接運行。


  1. 將當前目錄加入 PATH

例如你當前在 /home/user/test/ 目錄下,執行:

?export PATH=$PATH:/home/user/test/

現在再執行:

?hello

? 可以成功運行了!

🔒 注意:這只在當前終端會話中生效,重啟后失效。

2.除了 export PATH,還有哪些辦法讓程序能直接執行?

方法一:移動程序到系統路徑中

hello 拷貝到 /usr/local/bin//usr/bin/

?sudo cp hello /usr/local/bin/

然后就可以在任何地方直接運行:

?hello

方法二:在 ~/.bashrc~/.profile 添加路徑

讓設置永久生效:

?echo 'export PATH=$PATH:/home/user/test/' >> ~/.bashrcsource ~/.bashrc

小結

方法是否需要每次設置是否影響所有用戶
export PATH=...? 臨時有效
修改 ~/.bashrc? 永久有效(當前用戶)
拷貝到 /usr/local/bin? 永久有效是(需要 root)

和環境變量相關的命令

  1. echo: 顯示某個環境變量值

  2. export: 設置一個新的環境變量

  3. env: 顯示所有環境變量

  4. unset: 清除環境變量

  5. set: 顯示本地定義的shell變量和環境變量

環境變量的組織方式

環境變量獲取方式

通過代碼獲取環境變量

main參數

參數名類型含義
argcint命令行參數數量
argvchar* argv[]命令行參數字符串數組
envpchar* envp[]環境變量字符串數組

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;}

通過第三方變量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聲明。

通過系統調用獲取環境變量

?#include <stdio.h>#include <stdlib.h>int main(){printf("%s\n", getenv("PATH"));return 0;}

常?getenv函數來訪問特定的環境變量。

環境變量通常是具有全局屬性的

? 環境變量通常具有全局屬性,可以被子進程繼承下去


?#include <stdio.h>#include <stdlib.h>int main(){char *env = getenv("MYENV");if(env){printf("%s\n", env);}return 0;}

當我們直接運行程序什么都沒有輸出,說明該環境變量不存在。只進行 MYENV=“helloworld” ,不調用export導出,也不會有結果。

MYENV 只是 shell 的一個局部變量,不在環境表中。

getenv("MYENV") 無法讀取這個變量,所以程序無輸出。

當export導出環境變量時,放在bash中重新運行就有結果了。

環境變量被加入父 shell 的環境中,因此子進程(你運行的 ./code)能夠繼承并讀取

?

結束語

? ? ? ? 命令行參數與環境變量,看似是終端操作中最基礎的部分,實則是程序與系統交互的 “底層協議”。命令行參數讓程序得以根據用戶輸入動態調整行為(如 rm -rf 的強制刪除選項),環境變量則為程序提供了全局可見的 “配置上下文”(如 PATH 指引執行路徑、LANG 控制語言環境)。

? ? ? ? 理解它們的結構與原理,不僅能讓你更熟練地使用命令(比如知道如何通過 man 查看參數說明),更能幫你在編程時設計更靈活的程序 —— 無論是讓腳本接收用戶輸入參數,還是在代碼中讀取系統環境變量,這些知識都是必備的基礎。

? ? ? ? 值得注意的是,環境變量的 “全局屬性” 也提醒我們:敏感信息不應隨意存入環境變量,而命令行參數的可見性則要求避免在參數中傳遞密碼等隱私數據。

? ? ? ? 希望本文能讓你對命令行參數與環境變量的認知從 “模糊的工具” 變成 “清晰的邏輯鏈”。下次在終端輸入命令時,不妨多留意參數的含義與環境變量的作用 —— 你會發現,終端交互的每一個細節都藏著系統設計的巧思。如果有相關的實踐問題或心得,歡迎在評論區交流~

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

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

相關文章

C++設計模式:單例模式 (現代C++主流實現方式Meyer‘s Singleton + 使用CRTP模板化)

文章目錄單例模式創建單例類餓漢式or懶漢式現代C單例模式的主流實現方式——Meyers Singleton使用 CRTP 模板化單例類單例模式 單例模式是指程序中只需要一個實例化對象&#xff0c;在全局作用域或整個代碼架構中&#xff0c;此對象只被實例化一次&#xff0c;就可以達到在整個…

Eureka 和 Nacos

一、基本介紹EurekaEureka 是 Netflix 公司開發的一款基于 REST 風格的服務注冊與發現組件&#xff0c;專為分布式系統設計。它遵循 AP 原則&#xff08;可用性、分區容錯性優先&#xff09;&#xff0c;強調在網絡分區等異常情況下的服務可用性&#xff0c;是 Spring Cloud Ne…

文件IO筆試題

目錄前言一、核心概念&#xff1a;二、關鍵操作步驟&#xff1a;三、為什么需要文件IO&#xff1f;四、常見類型&#xff1a;五、標準IO源碼六、筆試真題和練習1.代碼實現1代碼實現22.代碼實現3.代碼實現4.代碼實現5.代碼實現七、總結前言 文件IO&#xff08;文件輸入/輸出&am…

前端學習 5:DFT

DFT技術 DFT &#xff08;design for testability&#xff09;&#xff1a;指在設計系統和電路的同時&#xff0c;考慮測試的需求&#xff0c;通過增加一定的硬件開銷&#xff0c;獲得最大可測性的設計過程。&#xff08;因為增加了硬件&#xff0c;所以也帶來了不足&#xff…

最長遞增子序列(LIS)問題詳解

最長遞增子序列LIS問題詳解一、問題定義與核心特征1.1 問題描述1.2 核心特征二、基礎解法&#xff1a;動態規劃&#xff08;DP&#xff09;2.1 解法思路2.2 Java代碼實現2.3 復雜度分析三、優化解法&#xff1a;二分查找貪心3.1 核心思路3.2 二分查找的作用3.3 Java代碼實現代碼…

什么是HTTP長連接、短連接?誰更能抗DoS攻擊?

想象你在快餐店點餐&#xff1a; 你&#xff1a;“一個漢堡”收銀員&#xff1a;“好的&#xff0c;15元”交易結束&#xff0c;你離開隊伍你想加杯可樂&#xff0c;重新排隊你&#xff1a;“一杯可樂”收銀員&#xff1a;“好的&#xff0c;8元”再次離開… 這種每次溝通后立即…

微軟徽標認證是什么?如何快速獲取驅動簽名?

在Windows系統中安裝硬件驅動時&#xff0c;是否遇到過“無法驗證發布者”的警告&#xff1f;這正是驅動數字簽名在背后發揮作用。對于軟件開發者而言&#xff0c;驅動數字簽名不僅是系統兼容性的保障&#xff0c;更是企業品牌信任度的核心。一、驅動數字簽名的核心作用驅動數字…

Apache Ignite緩存基本操作

這段內容主要講解了 Apache Ignite 中緩存&#xff08;IgniteCache&#xff09;的基本操作&#xff0c;包括獲取緩存、創建緩存、銷毀緩存、執行原子操作以及異步操作等。下面我將用中文對這些內容進行詳細解釋&#xff0c;幫助你更好地理解。一、獲取緩存實例&#xff08;Gett…

最新基于R語言結構方程模型分析與實踐技術應用

現代統計學理論和方法的不斷完善&#xff0c;使科研工作對統計方法的要求也越來越高&#xff0c;面對紛繁復雜的數據&#xff0c;如何選擇最為合適的數據分析方法已成為科研工作者&#xff0c;尤其是廣大剛處于科研生涯起步階段的研究生們最為棘手問題。隨著科學的發展&#xf…

物聯網_TDengine_EMQX_性能測試

一、Tdengine接口開發文檔 1、數據庫 1.創建數據庫 URL /dp/createdb/ method post 請求示例 {"db_name":"demo01" // 必填 }響應示例 // 成功 {"code": 1,"data": {"成功創建數據庫": "demo04"},"error…

從分析到優化:Amazon Q CLI 助力 EKS 網絡調用鏈剖析與運維實踐

1. 引言 在 Amazon EKS&#xff08;Elastic Kubernetes Service&#xff09;環境中&#xff0c;理解從 ALB&#xff08;Application Load Balancer&#xff09;到 Pod 的完整網絡調用鏈對運維人員至關重要。本文將展示如何利用 Amazon Q CLI 這一 AI 助手工具&#xff0c;通過…

Class10簡潔實現

Class10簡潔實現 import torch from torch import nn from d2l import torch as d2l# 輸入為28*28&#xff0c;輸出為10類&#xff0c;第1、2隱藏層256神經元 num_inputs, num_outputs, num_hiddens1, num_hiddens2 784, 10, 256, 256 # 第1個隱藏層丟棄率為0.2&#xff0c;第…

【多線程篇22】:ConcurrentHashMap的并發安全原理剖析

文章目錄一、HashMap 的“不安全”&#xff1a;問題的根源1. 數據結構回顧 (JDK 1.8)2. 并發下的致命缺陷&#xff1a;put 操作二、ConcurrentHashMap 的安全之道 (JDK 1.8)1. 核心數據結構2. 安全的 put 操作&#xff1a;分場景精細化加鎖3. 安全的 size() 計算&#xff1a;并…

【Java + Vue 實現圖片上傳后 導出圖片及Excel 并壓縮為zip壓縮包】

系統環境&#xff1a; Java JDK&#xff1a;1.8.0_202 Node.js&#xff1a;v12.2.0 Npm&#xff1a;6.9.0 Java后端實現 Controller /*** xxxx-導出* param response 返回信息體* param files 上傳的圖片文件* param param1 參數1* param param2 參數2*/PostMapping("/ex…

安科瑞:能源微電網助力工業園區“綠色”發展

朱以真近日&#xff0c;廈門市工業和信息化局印發工業園區綠色智慧微電網建設&#xff0c;擬開展全市工業園區綠色智慧微電網試點通知&#xff0c;那么對于如何實現綠色園區的建設是今天的話題。對工業園區綠色智慧微電網建設需求&#xff0c;其核心價值體現在“源-網-荷-儲-充…

VUE2 學習筆記3 v-on、事件修飾符、鍵盤事件

事件處理v-on用于事件交互。語法&#xff1a;v-on:要綁定的事件“事件觸發時執行的函數” &#xff08;函數這里可以寫括號&#xff0c;也可以不寫&#xff0c;沒有影響&#xff09;簡寫&#xff1a;:事件觸發時要執行的函數&#xff0c;在Vue配置參數中&#xff0c;通過method…

變換域通訊系統CCSK的matlab仿真

CCSK&#xff08;Cyclic Code Shift Keying&#xff09;通信系統的MATLAB仿真。實現完整的CCSK調制、AWGN信道傳輸和解調過程&#xff0c;并計算了誤碼率&#xff08;BER&#xff09;。 % CCSK通信系統仿真 clear; clc; close all;% 參數設置 L 31; % m序列…

技術演進中的開發沉思-40 MFC系列:多線程協作

今天說說MFC的線程&#xff0c;當年用它實現中間件消息得心應手之時&#xff0c;可以實現一邊實時接收數據&#xff0c;一邊更新界面圖表圖文信息&#xff0c;順滑得讓人想吹聲口哨。 MFC 多線程它像給程序裝上了分身術&#xff0c;讓原本只能 “單任務跑腿” 的代碼&#xff0…

高速公路自動化安全監測主要內容

近年來&#xff0c;隨著社會經濟的快速發展&#xff0c;高速公路的通車里程不斷增加&#xff0c;交通流量日益增大。與此同時&#xff0c;高速公路交通事故數量也呈現出一定的增長趨勢。這些事故不僅造成了大量的人員傷亡和財產損失&#xff0c;還嚴重影響了社會的穩定和經濟的…

完美解決 Ubuntu 中自定義啟動器圖標重復的問題(以 MATLAB 為例)

如果你在 Ubuntu 上為 MATLAB、PyCharm、Android Studio 或其他第三方應用創建了自定義啟動器&#xff0c;并把它固定到了左側的 Dock 欄&#xff0c;你很可能遇到過這個令人抓狂的場景&#xff1a; 當你滿心歡喜地點擊固定的圖標啟動程序后&#xff0c;Dock 欄上竟然“憑空”冒…