【Linux】环境变量入门

学习完进程之后,今天我们来学习 环境变量

基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量

查看环境变量

 echo $NAME //NAME: 你的环境变量名

测试PATH

假设我们现在已经有一个可执行程序 proc ,如果我们想运行它,很简单:

./proc

如果我们不加【./】呢?会报一个找不到该命令的错误

此时就有一个疑问,如果将程序也视为一种命令的话,为什么有些命令(比如:ls ,pwd…)不用加【./】能运行,有些命令,比如我们自己写的代码,要加【./】才能执行。

这是因为 当我们直接输入指令的时候,系统会在环境变量PATH 中寻找这条指令,找到,就运行,反之报错。
在这里插入图片描述

在这里插入图片描述
由图可以发现,我们的proc 指令 所在的目录 不在PATH 中。

但是,我们可以将我们的指令 所在目录 写入 环境变量里:

PATH=$PATH:hello程序所在路径

在这里插入图片描述
此时我们直接输入 proc ,程序就会执行。

测试HOME

通过系统调用获取或设置环境变量

我们还可以直接通过系统接口 getenv 和 putenv 来 获取或者设置 环境变量。
在这里插入图片描述
结果:
在这里插入图片描述


在命令行上运行的大部分的指令,父进程都是bash。
也就是说,当我们输入 【proc】之后,bash 建立一个子进程来运行我们的程序。

环境变量通常是具有全局属性的

命令行中,我们可以定义两种变量:

  1. 本地变量
  2. 环境变量

我们来定义一个本地变量 MY_VAL来看一下:
在这里插入图片描述
本地变量 的属性是 它只能在当前shell的命令行解释器内被访问,不可以被子进程继承。

而环境变量 又叫做 全局变量,可以被子进程继承。

我们可以将本地变量转化为全局变量:

export 本地变量名

在这里插入图片描述
我们在导入MY_VAL之后,在环境变量中搜索它,发现可以找到,说明成功。


这里细心的同学会发现一个问题:
在这里插入图片描述
当我们创建一个本地变量之后,并且用echo去访问它。按照之前所说,此时bash 会建立一个子进程来执行echo命令,由于本地变量的不可继承性,那么echo此时就不能找到MY_VAL。

实际上,之前我们说的是“在命令行上运行的大部分的指令,父进程都是bash。”
而此时的情况就是属于少数特例:

echo属于内建命令,是shell内的一个函数。 可以理解为 shell程序内部的一个函数。如果有内建命令,就执行(shell内函数当然可以在shell内的变量),没有,就fork一个子进程帮你执行。


和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

这里有一个要注意的是,set和env是包含关系。


环境变量的组织方式

命令行参数

我们先来会议一个东西:main函数。
main 函数实际上是有缺省参数的:

int main(int argc ,char* argv[])

其中argv是一个指针数组,每个指针指向一个字符串。而argc 决定了数组大小。

那么,这些“字符串”是什么? 我们写一个程序来看一下:
在这里插入图片描述


我们发现:main函数的两个参数 记录的是 命令行上写入的参数。所以,我们将这两个参数叫做命令行参数。
在这里插入图片描述
我们画个示意图:
在这里插入图片描述
但是,为什么我们需要有命令行参数?

对于这个问题,我们先来用命令行参数写一个小的计算器程序:
在这里插入图片描述
结果如下:
在这里插入图片描述


所以,命令行参数的作用是 同一个程序可以设计出不同的业务功能。

比如 ls 命令,我们是可以添加雨多附加属性的,比如 【ls -a 】 【ls -c】,再推广到windows的shutdown 命令,也可添加附加的参数,来完成更多更细致的功能。

env[]

main函数中,第三个参数是 env[],也就是一个指针数组,其中的指针指向环境变量。
在这里插入图片描述
我们也可以通过程序来验证一下:
在这里插入图片描述
或者用这种写法写可以:
在这里插入图片描述

在这里插入图片描述
env 参数 的作用是继承环境变量,从而实现环境变量被子进程继承下去,“全局属性”。

猜你喜欢

转载自blog.csdn.net/qq_53268869/article/details/122922585