目录
[一 命令行参数和环境变量](#一 命令行参数和环境变量)
[1 命令行参数](#1 命令行参数)
[2 环境变量](#2 环境变量)
环境变量具有全局属性------本质:环境变量被子进程继承了!
一 命令行参数和环境变量
1 命令行参数
main函数有参数吗?
有的
bash
int main(int argc, char* argv[])
其中:char* argv是指针数组,有效元素是argc个
我们通过下面这个程序,来演示一下命令行参数:

同一个程序,根据选项的不同,呈现出不同的功能, 这种功能是通过命令行参数完成的

通过上面的两个参数我们发现:bash是以空格为分隔符,把每个字符填入到argv中,argv表以NULL结尾,让函数实现多选项功能
当我们在命令行输入不同的参数时,根据参数的不同,会执行不同的指令,如下:

解析命令行参数,通常是由bash来做
每个进程在启动的时候,都会有一张表:命令行参数表
Windows中也有类似的功能,例如:关机命令shutdown,也可以跟上不同的选项
2 环境变量
(1)概念+实际场景
变量:变量名+变量内容(和系统相关)
Windows怎么让可执行程序在命令行运行起来?
把程序的路径(不包括程序名),添加到系统的环境变量里(系统的环境变量可以在搜索框搜索出来)。命令行+程序回车,就能启动
下图演示了把网易云音乐加入到命令行启动的操作过程:

类似于这种,被系统用来做路径查找、记录操作和版本信息、记录工作路径等,这种系统级的变量,称为环境变量。
安装git,python这种软件的时候都会让配置环境变量
环境变量是系统级变量,保存系统启动和运行的核心参数,通常具有全局属性!
(2)引入Linux环境变量
我们先来引入一个环境变量:PATH
获取环境变量:echo $PATH
为什么用 C 语言写的程序myproc运行时要带路径./myproc,但pwd这类系统指令不用带路径?
系统开机时会维护环境变量PATH,这个变量里记录了该去哪条路劲查找指令。
pwd 等系统指令:它们的存放目录(如 /bin, /usr/bin)被预先配置在环境变量 PATH 中,系统能自动找到。
./myproc:你的程序所在的当前目录不在 PATH 中,所以必须用 ./ 明确告诉系统程序的位置,强制它直接执行当前目录下的文件
如果把当前路径添加到环境变量,运行时就不用加./,该怎么操作?
a 不正确的添加方法:PATH=[当前路径]
虽然这样会使myproc(自己写的程序)前面不用加./就能运行了,但是会导致其他指令没有办法运行,相当于直接覆盖了之前的路径
结论1:命令行中,修改环境变量,是内存级修改,重启 xshell 会恢复
b正确的添加方法:PATH=PATH:[当前路径]

which 命令通过 PATH 环境变量来查找可执行文件
which 是 Linux/Unix 系统中非常常用的命令,核心功能是在 PATH 环境变量指定的所有目录里,搜索指定命令的可执行文件路径,并返回第一个匹配到的结果。简单说,它能帮你快速定位 "某个命令到底存在于哪个文件夹"

常见环境变量:
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(即用户登陆到 Linux 系统中时,默认的目录
- SHELL:当前 Shell,它的值通常是 `/bin/bash`
查找环境变量:
bash
echo $NAME //NAME:你的环境变量名称
环境变量各自独立
查所有的环境变量:env


getenv:获取环境变量的内容
在实际开发中,我们通常不需要遍历所有变量,而是想获取某个特定变量(比如 PATH)的值。这时使用标准库函数 getenv() 更方便。

指令的可执行程序,只能被"我"执行
我们来总结以上学到的内容:


(3)获取,设置环境变量
环境变量也有表,最后一个有效元素的下一个元素,必须是NULL
获取环境变量表的几种办法:
a. main函数其实仍然存在第三个参数,给main函数带第三个参数,就能获得环境变量表
标准的 main 函数有两种写法,第三种参数就是环境变量指针数组
bash
// 写法一:使用第三个参数
int main(int argc, char *argv[], char *envp[]) { ... }
// 写法二:标准写法 (不写 envp)
int main(int argc, char *argv[]) { ... }
envp:全称 environment pointer,是一个字符串指针数组。
它的每一个元素 envp[0], envp[1]... 都是一个字符串,格式为 "变量名=变量值"(例如 "PATH=/usr/bin:/bin")。
数组的最后一个元素是 NULL,标志着环境变量列表的结束

运行结果:
你会看到和在终端里输入 env 命令几乎一样的输出,包含 PATH, HOME, PWD, USER 等所有环境变量。
b 通过第三方变量environ获取
在c语言中,存在一个char** environ,第三方全局变量,指向这张表,头文件<unistd.h>


c 通过getenv获取单个环境变量
上面两种方法都是简单粗暴的获得所有的环境变量,但是在实际开发中,我们通常不需要遍历所有变量,而是想获取某个特定变量(比如 PATH)的值。这时使用标准库函数 getenv() 更方便

getenv()函数返回一个指向环境中对应值的指针;如果没有找到匹配项,则返回NULL

(4)理解环境变量,修改配置文件实验
先引入一个结论:
结论:任何进程启动,都会存在两张表: 1. 命令行参数表 2. 环境变量表
这两张表都是由一个叫做bash的进程提供的,当我们登录的时候,bash提供命令行解析
环境变量具有全局属性------本质:环境变量被子进程继承了!
这一个一个环境变量值从哪里来的?从系统的配置文件。
环境变量是内存级的?环境变量表是内存级的。

本地变量:形如ok=1234,只在bash内部有效,不能继承
和环境变量相关的命令

环境变量是从系统的配置文件中来的
修改环境变量的本质:修改Linux中的配置文件
Linux系统内有两种命令,普通命令和内建命令
普通命令就是我们平时常见的命令
内建命令代表有:export env cd-
内建命令的特点:不会通过创建子进程执行,由bash提供且自己执行
bash其实也是一门脚本语言,是由c语言写的面向对象语言
bash内部1有很多的函数,调用自己内部的函数,假设调用这个函数,这个命令就叫做内建命令
