目录

一、命令行参数

main函数有参数吗?

为什么要有命令行参数?

二、环境变量

引出环境变量

理解环境变量

介绍几个常见的环境变量

查看环境变量

echo $ 查看某个环境变量

env 查看所有环境变量

修改环境变量

环境变量 代码 进程 之间的关系

getenv

三、环境变量为什么具有全局属性

四、本地变量

什么是环境变量?

本地变量和环境变量的关系

export

是否具有全局性?

五、常规命令和内建命令

六、总结


一、命令行参数

命令行参数是程序运行时通过命令行传递给程序的参数,用于在不修改代码的情况下动态调整程序的行为。

main函数有参数吗?

答案是有的

在C/C++中,main 函数的标准形式可以接收命令行参数

argc(argument count):参数的个数(程序名本身算第一个参数,所以 argc 至少为1)。

argv[](argument vector):参数的字符串数组, argv[0] 是程序的名称, argv[1] 是第一个用户传入的参数,依此类推。

  1. 细节1 : 命令行参数,至少是1,-->>argc>=1,argv[0]一定会有元素,指向的就是程序名
  2. 细节2 : 选项---是以空格分隔的字符串,一个字符,也是字符串
  3. 细节3 : 有argc个,argv[argc-1]是最后一个,argv[argc] = NULL

main 函数的 argc/argv 与Linux命令行中“指令+选项”有什么关系?

  • Linux指令的选项和 main 函数是直接相关的——Linux指令本质是一个可执行程序,它的选项就是通过 main 函数的 argc/argv 来接收的。
  • 举个例子:Linux中的 ls 指令是一个C语言编写的程序,它的 main 函数会读取 argc/argv 来判断用户输入的选项(比如 -l 、 -a ),进而执行对应的逻辑(显示详细信息、显示隐藏文件)。
  • 本质上来说Linux下的指令(如 ls 、cp 等)本身是独立的可执行程序,这些程序大多是用C语言编写的——而C语言程序接收命令行参数的标准方式就是main函数的 argc/argv。

为什么要有命令行参数?

命令行参数的本质应用是为了实现一个命令可以根据不同的选项实现不同的子功能,也是Linux中所有命令选项功能的实现方式

二、环境变量

引出环境变量

1. 为什么运行自己编译的程序需要 ./ ?

  • Linux Shell执行命令时,会默认去指定的目录中查找可执行文件。而我们自己编译生成的 mycommand 位于当前目录(而非系统指定的目录),因此必须用 ./mycommand 明确指定“当前目录下的该程序”。

2. 为什么执行系统的命令可以不用带 ./...

  • 系统命令(如 ls 、 cd )的可执行文件存放在系统指定的目录中(例如 /bin 、 /usr/bin )。
  • Shell会自动在这些目录中搜索命令,因此直接输入命令名即可执行。

3. Linux系统自己怎么知道自己要去哪一个路径下去找要执行的可执行程序?

  • Linux系统会存在所谓的环境变量的东西 : PATH环境变量,PATH属于环境变量中的一种。
  • Linux通过 PATH 环境变量中定义的目录列表,来查找要执行的可执行程序。

理解环境变量

1. 如何理解环境变量?

  • 环境变量就像系统里的“小纸条”,上面写着一些全局的、提前约定好的信息,所有程序/Shell都能看这些“小纸条”来获取需要的配置。
  • 比如 PATH 也是其中一张“小纸条”,专门写着“找可执行程序该去哪些目录”。

2. 环境变量和系统默认路径是怎么联系起来的?

  • 系统在安装的时候,会默认给 PATH 这张“小纸条”上预先写好几个常用目录(比如 /bin 、 /usr/bin )——这些就是系统默认指定的路径。
  • 这么做的目的是“统一规则”:系统把所有默认命令(比如 ls 、 cat )都放在这些目录里,然后告诉Shell“你直接去这几个目录里找命令就行”,不用每次执行命令都手动写路径。

总结: PATH 是环境变量的一种,系统提前在这个环境变量里写好了默认路径,所以Shell会自动去这些路径找命令——这就是两者的联系。


介绍几个常见的环境变量

  1. PATH:是linux系统的指令的搜索路径,是环境变量中的一种
  2. HOME:指定用户的主工作目录(即用户登录到linux系统中时,默认的目录)
  3. SHELL:当前SHELL,它的值通常是/bin/bash

查看环境变量

echo $ 查看某个环境变量

以冒号为分隔符的多串路径

PATH的意思就是告诉Linux系统,如果一个用户在执行命令时,如果没有指明路径,就会在上面的多串路径中依次查找

env 查看所有环境变量

红色圈出的部分是Linux系统中常用的一些环境变量:
1.  XDG_SESSION_ID=183405 

  • 含义:当前用户会话的唯一标识ID,由系统管理会话时分配,用于区分不同的用户登录会话。

2.  HOSTNAME=VM-16-7-centos 

  • 含义:当前主机(服务器)的名称,用于网络中识别这台机器,这里是CentOS虚拟机的主机名。

3.  SHELL=/bin/bash 

  • 含义:当前用户默认使用的Shell程序(命令解释器),这里是 bash (Linux最常用的Shell)。

4.  HISTSIZE=3000 

  • 含义:Shell历史命令的最大保存条数,这里设置为最多保留3000条执行过的命令。

5.  OLDPWD=/home/cxj/116_117 

  • 含义:记录上一次所在的工作目录路径,方便用 cd - 快速回到之前的目录。

6.  PATH=/usr/local/bin:/bin:/usr/bin:... 

  • 含义:系统执行命令时的搜索路径,当你输入一个命令(比如 ls ),系统会按这个路径顺序查找对应的可执行文件。

7.  PWD=/home/cxj/116_117/lesson15 

  • 含义:当前所在的工作目录(Present Working Directory),即你现在在终端中操作的文件夹路径。

8.  HOME=/home/cxj 

  • 含义:当前用户的主目录路径,登录后默认进入的目录,也是用户个人文件的存放位置。

修改环境变量

如果要添加或修改某个环境变量以PATH为例

这里通过 PATH=$PATH:/home/cxj/116_117/lesson15 ,将当前目录(lesson15)添加到 PATH 中;

所以再次执行 mycommand 时,Shell会自动在 PATH 包含的目录(包括刚添加的 lesson15 )中找到该程序,因此无需再用 ./ 前缀。

但是需要注意的是 : 这个操作属于临时修改 PATH关闭当前终端后,添加的目录会从 PATH 中消失。


环境变量 代码 进程 之间的关系

环境变量和 C/C++代码 以及 进程 之间有什么关系?

用代码获取环境变量

从上面第一部分的命令行参数的内容我们可以知道main函数能有两个参数 , 那main函数最多有几个参数呢?

答案是三个 , main函数最多可以有三个参数

main函数的第三个参数本质是把环境变量(环境变量表)传给进程!

getenv

getenv 函数:定义在 <stdlib.h> 中,用于获取系统环境变量的值,参数为环境变量名,返回对应的值(字符串指针)。常用于获取系统配置(如 PATH 、 HOME 、 USER 等环境变量)。

代码通过 getenv("USER") 获取当前系统的 USER 环境变量(值为 cxj ),并打印输出。编译运行后输出 whoami: cxj ,与环境变量 USER=cxj 对应。


三、环境变量为什么具有全局属性

理论

我们所运行的进程都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给子进程的环境变量,那么bash是所有进程的父进程,bash创建的子进程有可能再创建子进程,那么此时的进程关系就形成了一颗多叉树的形状,那么对应由于子进程要继承父进程的环境变量,而bash又是所有进程的父进程,那么bash中的环境变量在全部进程中都会有一份,那么此时环境变量就具有全局属性

子进程能继承父进程的全局数据(包括表信息)

这两张表(命令行参数表/环境变量表)默认是在bash内部,bash本质上是一个进程,进程又在内存中,所以这两张表在内存中

那bash进程的环境变量,又是从哪里来的呢?

从linux系统的配置文件中来的

每次新建一个终端窗口(或标签页),系统都会启动一个新的Bash进程。每个终端窗口/标签页对应一个独立的Bash进程;这些进程相互独立,各自加载对应的配置文件,进程间的环境变量、别名等不会互相影响。

那什么是配置文件?

隐藏的配置文件

 .bash_profile  依赖  .bashrc :

  • 上方的 .bash_profile 中通过 if [ -f ~/.bashrc ]; then . ~/.bashrc; fi ,表示“如果 .bashrc 存在,就加载它的内容”。这是为了让登录Shell同时获得 .bashrc 里的别名、函数等配置。

 .bashrc  依赖  /etc/bashrc :

  • 下方的 .bashrc 中通过 if [ -f /etc/bashrc ]; then . /etc/bashrc; fi ,表示“如果系统级的 /etc/bashrc 存在,就加载它的内容”。这是为了让用户级配置继承系统全局的基础Shell配置。

四、本地变量

什么是环境变量?

在Bash中,本地变量是仅在当前Bash进程(比如你新建的某个终端窗口)内生效的变量。

  • 定义:直接赋值,格式 变量名=值 (等号前后无空格),例: name=cxj 、 num=10 。
  • 使用:用 $变量名 调用,例: echo $name (输出 cxj )。
  • 删除:用 unset 变量名 ,例: unset num (删除 num 变量)。

本地变量无法被子进程继承,即不具备全局性

本地变量和环境变量的关系

export

在Bash中把本地变量转为环境变量,用 export 命令实现,还能根据需求设置临时生效或永久生效

  1. 临时生效(仅当前终端会话):先定义本地变量再导出,比如 TEST_NRV=123456789 ,接着执行 export TEST_NRV;也能直接定义并导出,命令是 export TEST_NRV=123456789 ,这种方式下变量仅在当前终端有效,关闭终端就失效。
  2. 永久生效(所有新终端都能用):若想变量长期有效,可把 export 命令写入配置文件。用户级配置写 ~/.bashrc ,执行 vim ~/.bashrc 打开文件,末尾加 export TEST_NRV=123456789 ;

这里我们光演示一下临时生效的情况

添加了的环境变量子进程也能访问到

那我们如何取消刚添加的环境变量呢?

使用unset就可以取消了

是否具有全局性?

本地变量不能被子进程继承,但本地变量转为环境变量后可以被子进程继承。

  1. 本地变量:仅在当前Bash进程有效,无法被子进程继承(比如当前进程启动子进程后,子进程读不到这个变量)。
  2. 本地变量转环境变量:用 export 将本地变量升级为环境变量后,可以被子进程继承(子进程能读取到这个变量)。

举个例子:
步骤1:定义本地变量  a=10 ,启动子进程 bash ,执行 echo $a  → 输出空(本地变量没被继承)。
步骤2:回到原进程,执行 export a (把本地变量转环境变量),再启动子进程 bash ,执行 echo $a  → 输出 10 (环境变量被继承)。

五、常规命令和内建命令

常规命令:存在的二进制文件级别的命令

内建命令:在shell内部自己定义,属于bash自己内部的一次函数调用,不依赖第三方路径

六、总结

本文主要探讨了命令行参数和环境变量在Linux系统中的工作原理与应用。命令行参数通过main函数的argc和argv实现程序行为的动态调整,这是Linux命令选项功能的实现基础。环境变量如PATH定义了系统查找可执行程序的路径,具有全局属性,子进程会继承父进程的环境变量。文章还介绍了本地变量与环境变量的区别,以及如何通过export将本地变量转为环境变量。最后区分了常规命令(二进制文件)和内建命令(shell内部函数)的不同特性。这些机制共同构成了Linux系统灵活的命令执行和环境配置体系。

感谢大家的观看!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐