【linux】环境变量(进程二)

命令行参数:

不谈命令行参数就谈环境变量就是耍流氓。

相信我们在C语言阶段都在main函数里见过参数。
例如int main(int argc, char* argv[])
这是什么东西呢?
话不多说我们直接打印一下看看:
在这里插入图片描述
现象:
在这里插入图片描述
到此为止我们发现argv这个数组存放着一个个指针,这些指针指向我们传入的参数。
也就相当于给我们传了一张表
在这里插入图片描述


再来看这样一段代码:
在这里插入图片描述
现象:
在这里插入图片描述

那么现在就产生两个问题:

  1. 为什么要有这中功能的存在?
  2. 谁传给我们的?

先回答第一个:
我们先来看这样一个命令:
在这里插入图片描述

是不是与我们刚刚进行的操作一样!!

没错,命令行参数的本质就是交给我们程序不同的选项。用来指定不同的程序功能!!


再来看第二个问题:

先说答案:是bash。
那么他是如何给我们的呢?

先来看这样一段代码:
在这里插入图片描述

现象:
在这里插入图片描述
由此可以验证子进程是可以拿到父进程的代码和数据的。

那我们父进程的父进程的谁呢,也就是父进程的ppid
在这里插入图片描述
就是bash,所以我们运行的二进制可执行文件就是bash的子进程,linux中大约70多的命令都是bash子进程。

那我们将二进制文件名与所带的选项给bash,bash的子进程也理所应当的可以拿到这些数据。在这里插入图片描述


环境变量:

初理解:

相信大家也发现看了我们自己执行程序与直接执行linux系统中的命令用法是不一样的,我们的进程执行需要加所在路径,这就是环境变量再从中作祟。
我们先来以一个PATH环境变量来作为切入点。
在这里插入图片描述
PATH是环境变量的变量名,使用$就像指针解引用一样得到指向的内容。
再使用echo命令进行打印。

我们得到PATH内容发现,这里就包含了一个一个路径,以作为分隔符,而我们执行例如ls touch等命令时他们的所在路径就在PATH内,因此命令行解释器就知道去哪里寻找这些命令了在这里插入图片描述

那么我们可以将自己写的程序进行这样的操作码?

答案是可以的!!
只需要将我们自己写的程序的当前所在路径放入PATH中即可
在这里插入图片描述

但是这样问题又出现了,我们之前可以执行的进程不能跑了在这里插入图片描述
不需要担心linux这时候被我们玩坏了,因为这些环境变量都是内存级别的!!!
而真正的数据(环境变量)都是在配置文件中的,我们每次加载linux系统时,这些配置文件就被加载到bash(内存)中

那我们需要怎样进行恢复呢?
答案依旧简单:我们重启即可在这里插入图片描述
配置文件在哪里呢?
在我们的root目录下在这里插入图片描述
若是我们想将我们的程序永久的改成与系统命令一致,在配置文件中写入路径即可。
在这里插入图片描述

见见更多的环境变量:

使用env命令即可查看全部环境变量。
在这里插入图片描述

例如HOME:你的家目录
SHELL:你的SHELL是什么
HISTSIZE:历史保存的命令个数
PWD:可变的当前路径

在这里插入图片描述

加入新的环境变量:

使用export命令即可加入新的环境变量
在这里插入图片描述
使用unset命令+环境变量名即可删除。

与程序结合进行更一步理解:

我们可以通过在命令行解释器直接输入env进行得到环境变量,那么我们的程序怎么拿到呢?

我们使用char** environ这个变量进行拿取:(为什么类型是**马上解释)
在这里插入图片描述
这个拿取的方式是不是与我们的命令行参数有些类似呢?

我们已经铺垫过,父进程的数据子进程也是可以拿到的
而环境变量是bash内部的数据,我们启动的进程时bash的子进程
在这里插入图片描述

这也就解释了为什么environ的类型为什么是char**

上边拿取环境变量的方式过分简单粗暴,我们有没有别的方法进行拿取?
答:有!!
既然环境变量与命令行参数类型一致,使用方法也一直,bash既然可以将命令行参数传给我们也可以将环境变量传给我们!
在这里插入图片描述

结论:

bash启动时,会默认给我们两张表:
第一张是
环境变量具有系统级的全局指令,可以被继承下去在这里插入图片描述

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值