《命令行参数与环境变量:从使用到原理的全方位解析》

前言

       当我们在终端输入 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 栏上竟然“凭空”冒…