11_Linux学习总结_环境变量

在讲环境变量之前先讲命令行参数

我们平常写的main函数其实是有参数的。

我们在执行程序的时候,其实是有其它函数调用我们的main函数。所以其它函数在调用main函数时就会向main函数传递参数。

我们现在把main函数的参数写出来,并打印参数。看看传给main函数的参数是什么。

main函数的第二个参数是指针数组,用来存放字符串的指针数组。

第一个参数代表着这个数组里有几个元素。

现在来执行一下这个程序。

按下回车查看结果:

可以发现,我们写的打印语句把刚刚我们输入的命令给打印出来了。

再试着执行几次,并且在 ./test 后面加上a b c等

现在看到的现象我来画一张图给大家展示一下:

这里的./test a b c就是命令行参数。

我们平时用的命令像 ls、rm其实就是程序

然后在使用这些命令时通常会配合选项来使用

如:

现在我写一下代码来讲解这个命令行参数是拿来做什么用的。

现在来执行这个程序

有了上面的过程,我们就可以知道命令行参数是让程序可以通过不同的选项实现不同的子功能。

总结:在这个程序运行时,该进程拥有一张表,是argv表。用来支持实现选项功能。

我们知道运行程序时必须知道这个程序的所在位置,所以我们运行test程序需要带上路径,为什么ls不需要带上路径呢?

这是因为系统中存在环境变量来帮助系统找到程序所在位置。

这里查看了ls命令所在的位置。既然ls可以不用带路径使用,那我们把test程序拷贝到/usr/bin路径下是不是就可以不带路径使用呢?

这里来尝试一下:

(注:这里我把test程序删掉了,重新编译成mytest了,内容都是一样的。)

现在已经把该程序拷贝到了/usr/bin路径下

现在试着不带路劲使用运行程序

发现我们自己写的程序不需要带上目录也能运行了。(这里不建议大家把自己的程序复制到该目录下,这里只是为了演示。)

这里我们能够看到的现象就是系统会自己去/usr/bin目录下寻找程序。

那为什么系统会去该目录下寻找呢?

这是因为Linux中存在环境变量PATH

这个环境变量PATH告诉了系统默认该区哪里找程序。

查看所有环境变量命令:env

能够看见环境变量,既然是变量。那么就是

变量名=内容

这种形式

当我们知道某个环境变量的名字,就可以使用

来查看这个环境变量的内容

当我们运行一个程序时,系统就会在环境变量PATH里面查找

PATH里面有多个路径,以符号 :来分割

在第一个路径找不到就会去下一个路径找。直到都没有找到

我们现在知道运行程序时系统回去环境变量PATH中查找。如果把我们程序所在的目录拷贝到PATH中,那是不是就可以不用带上路径就可以直接执行程序呢?

我们来尝试一下:

可以观察到可以直接执行程序mytest

但是现在有一个问题

我们在执行ls这些系统命令时,不能直接运行了(注:pwd是内置命令,先不考虑)

会不会是我们上面拷贝的时候把原先的内容给覆盖了

现在再查看一下环境变量PATH

可以发现确实是我们把原先的路径给覆盖掉了。想要复原就把终端关闭程序启动一下。

重新启动后:

那我们要如何把自己的路径赋值给环境变量PATH呢?

这里的$PATH就是获取PATH的内容然后加上符号:再跟上路径

现在再来查看一下PATH

可以发现路径成功的拷贝了

现在再运行mytest程序,发现可以不带路径直接运行,结果如下:

此时如果再次关掉终端从新再打开,环境变量就会复原

在我们运行程序时,如 mytest -a

进程bash其实会先拿到命令行参数mytest -a

(关于bash,大家可以去问一下ai是什么或者搜索相关文章,因为我写的这些文章目的只是自己用来复习,加强记忆的。我在学习的过程中会学习到其它内容,如bash。但是由于我个人精力和能力的不足,就没有把这些内容写出来。)

然后通过这个命令行参数生成命令行参数表(也是指针数组,跟main函数参数中char* argv[]相同)

同时bash也会生成环境变量表,会把环境变量以字符串的形式记录在表中

当我们在 bash 中输入 mytest -a或 ls -a这类命令时,bash 的执行逻辑如下:

  1. 解析命令行:将输入的字符串拆分为命令名(如 mytest/ls)和参数(如 -a),生成标准化的参数表(对应程序 main 函数的 argc/argv);
  2. 查找命令:
    先判断是否是 bash 内置命令(如 test/pwd),若是则直接执行,不走后续流程;
    若不是内置命令,则读取 PATH环境变量,遍历其中的路径(如 /usr/bin、/bin 等),查找与命令名匹配的可执行文件;
  3. 执行命令:
    找到则获取完整路径(如 ls 对应 /usr/bin/ls),bash 调用系统调用,将「完整路径 + 参数表」传给操作系统,由操作系统创建子进程执行程序;
    没找到则报错 command not found。

比如输入 ls -a,bash 最终会向操作系统发起"执行 /usr/bin/ls,参数为 -a的请求,这也是为什么我们直接输入 ls -a 和输入 /usr/bin/ls -a 效果完全一致的原因。

相关推荐
xlp666hub12 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
张宏23613 小时前
原子操作 (基于Linux 应用层 C 语言)
linux
kymjs张涛1 天前
OpenClaw 学习小组:初识
android·linux·人工智能
程序设计实验室1 天前
经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台)
linux
Miku161 天前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·人工智能·agent
Miku161 天前
OpenClaw 接入 QQ Bot 完整实践指南
linux·人工智能·agent
Yogurt_cry2 天前
[树莓派4B] 闲置近10年的爱普生 L310 打印机爆改无线打印机
linux·物联网·树莓派
Johny_Zhao2 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
Sheffield3 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器