了解main的参数
我们直接来看一下这个函数
我们可以合理推测这个argc是记录命令行参数的的个数多少,而argv[]记录命令行的具体命令
我们来做一个小demo初步实现linux的命令行,留个印象
我们来思考一下为什么要有命令行参数
命令行参数本质上是为了实现一个命令,根据不同的子选项,来实现不同的子命令
什么是环境变量
环境变量(Environment Variable) 是操作系统或运行环境中用来存储系统配置信息、路径、行为开关的一类“全局变量”,可以被系统中的程序直接读取和使用。
从操作理解环境变量
为什么我们按ll可以查看文件夹内的信息,pwd怎么可以看当前的路径
为什么我们要这样./main.c才能运行这个二进制文件
因为系统并不知道二进制的位置,而pwd,ll,cd命令都在user/bin的文件夹下面,系统自动去哪个文件夹下面找可执行二进制文件.就是说
环境变量里记录的那些文件夹,操作系统挨个翻一遍,去找有没有这个名字的可执行文件。
如果找到了:就运行它。
如果找遍了都没找到:就会报错 command not found。它会把 PATH环境变量里记录的那些文件夹,挨个翻一遍,去找有没有这个名字的可执行文件。
其他可执行文件不知道位置,所以要加上文件的位置信息
更改环境变量
现在可以直接运行main.exe文件
但是之前的ls等指令都无法实行了
但是我们退出后会恢复,为了不丢失原来的系统指令,要用下面这种方法,但是下面也是零时的办法
永久写进去
echo 'export PATH=$PATH:/your/dir/here' >> ~/.bashrc查看环境变量的方法
PATH环境变量:存储命令指令的文件的文件地址
环境变量改变了,原来的命令无法执行了,但是没有关系 ,我们退出在进就欧克
除了上面这种还有其他的环境变量
env可以看到所有的环境变量
user就会记录当前的使用者
pwd就会记录当前文件的所在位置
当然还有其他的,这里不做过多介绍
main的参数查看环境变量
main函数可以有多个参数,第三个是环境变量,为了没有警告我们对前两个参数也要操作.
env是二级指针数组,里面存有环境变量的内容,我们可以像访问数组一样去获取环境变量的地址
使用函数来获取getenv
getenv+你想要的环境变量,就可以获得你所需环境变量的值
环境变量底层传递的原理
子进程继承父进程的环境变量
我们让父进程打印完,在打印子进程
父进程和子进程的环境变量的数目是一样的,环境变量的内容也一致
子进程从父进程那里继承环境变量
当然子进程在fork一个进程,fork出来的进程也可以继承环境变量
子进程从bash那里继承环境变量,那bash里面的环境变量又是从哪里来的呢?
bash 自身的环境变量源头,全部来自系统 / 用户本地配置文件,并非凭空存在;同时能完美解释「临时改 PATH,新开 Xshell 就恢复原样」这个现象
子进程会从父 bash 进程继承内存中的环境变量,而 bash 自身加载的环境变量全部来自 Linux 本地的系统、用户配置文件。每次 bash 实例启动时,都会按固定顺序读取硬盘上的配置文件,将文件中定义的 PATH、自定义变量加载到自身运行上下文。这也能解释我们直接在终端临时修改 PATH 后,重新打开 Xshell 环境变量就恢复默认的现象:命令行执行 export 修改 PATH 只是临时存入当前 bash 进程内存,不会写入硬盘配置文件;关闭当前终端窗口后,该 bash 进程销毁,内存里临时新增的路径直接丢失;新打开的 Xshell 会创建全新 bash 进程,重新读取原始配置文件初始化环境,PATH 自然变回文件内预设的默认值。如果想要配置永久生效,需要将 PATH 追加语句写入~/.bashrc、/etc/profile 等持久化配置文件。
系统级配置(所有用户共用,开机 / 登录时加载)
/etc/profile:登录 Shell 最先读取,定义全用户基础 PATH、系统全局变量;/etc/profile.d/*.sh:/etc/profile会自动批量执行该目录下所有脚本,用于拆分系统环境配置;/etc/bashrc(CentOS)//etc/bash.bashrc(Ubuntu):全局交互式 shell 配置,所有新开终端都会加载,统一设置提示符、全局别名。
我们来看一下bashrc,bash_profile
这两个文件都是再用户家目录下的隐藏文件
bash_profile
他会读取bashrc的内容
bashrc
他会访问ect下面的bashrc
![]()
etc/bashrc
设置全系统所有用户共享的交互配置:
- 全局 shell 提示符 PS1、配色
- 全局别名 alias(所有用户都能用)
- 全局函数
- 自动补全、shell 安全设置
那么我们就可以设置一个自己的登录信息提示
了解变量
局部变量
我想要定义一个自己的环境变量
发现找不到我自己定义的环境变量,但是是存在这个变量的
因为这个环境变量还只是本地变量,也就是局部变量,他无法被子进程继承,没有全局性,只可以在bash内部访问
将局部变量转换为转为环境变量(环境变量是全局变量)
我们要用export将他导入环境变量,之后再搜索即可
export TEST=100环境变量时全局的,子进程可以继承父进程的环境变量,
去除环境变量
unset 环境变量名查看局部变量和全局变量
set| 对比项 | 局部变量 | 环境变量 (export 导出) |
|---|---|---|
| 定义语法 | var=xxx | export var=xxx/ 先赋值再 export |
| 子进程继承 | ❌ 不能继承 | ✅ 子进程自动复制一份 |
| C 语言 getenv 读取 | ❌ 读不到 | ✅ 可以读取 |
| 查看命令 | set(仅 shell 本地变量) | env/printenv |
| 删除命令 | unset var | unset var(同时从环境表清除) |
| 生命周期 | 当前 shell 会话,关闭消失 | 当前 shell 会话,关闭消失 |
| 持久化 | 无法永久保存 | 写入~/.bashrc等配置文件可永久生效 |