写过一篇 发表于 2024-9-28 18:31:56

【Linux】环境变量(初步熟悉环境变量)

https://i-blog.csdnimg.cn/direct/943a341ae75343bba08dc9fb11582ba0.gif#pic_center
1. 环境变量

在main函数的命令行参数中,有argc、argv、env三个参数。


[*]argc:命令函参数的个数
[*]argc:存放每个参数的具体数值
https://i-blog.csdnimg.cn/direct/bd49ba0e388c45e594d89ee2988ed947.png
通过这两个参数,我们可以根据传进来的参数做出判断,来举行相对应的操纵,进而到达指令带选项的效果
那第三个参数env是什么呢?- - 环境变量
我们打印出了env中所有的数据,就是环境变量。
https://i-blog.csdnimg.cn/direct/aafe2eefdca1451896cda9cb55eaac9f.png
1.1 基本概念

环境变量(environment variables):一般是指在操纵体系中用来指定操纵体系运行环境的一些参数,未来会以shell的形式传递给所有进程,每个进程都会熟悉这些参数。
   

[*]如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是还是可以链接乐成,生成可实行步调,原因就是有相关环境变量帮助编译器举行查找。
[*]环境变量通常具有某些特殊用途,而且在体系当中通常具有全局特性。
常见的环境变量有哪些呢?
使用命令env可表现shell自己的环境变量。
https://i-blog.csdnimg.cn/direct/77ec8c5b53e946f09123ad15fe70e223.png
2. 熟悉常见环境变量

2.1 PATH

   PATH:指定命令的搜刮路径
各人在敲指令的时候有没有过如许的问题:为什么我自己写的可实行步调实行时要 ./ 指定路径,而实行体系命令时就不用带指定路径呢?
   体系在实行指令的时候会去/usr/bin路径下去找
https://i-blog.csdnimg.cn/direct/41b051741ce841dea8662db878adcf21.png
但是体系为什么会知道命令在/usr/bin路径下呢?
在shell登录的时候,环境变量PATH告诉shell去哪个路径下去查。
   

[*]使用 echo 命令可以表现某一个环境变量 echo $PATH
https://i-blog.csdnimg.cn/direct/3654fc88150a4c4a84b43d3f58adf240.png
[*]PATH中包含多个路径,以冒号作为分隔符
因此,在shell运行某个命令时,它首先会去PATH中以冒号作为分隔的多个路径下去查找命令。当把PATH中所要求的路径全部找完,依旧没有找到的环境下,就会报出command not found;一旦在恣意路径下找到命令,就会将命令加载并实行。
以是我们在实行体系命令时不必要指定/usr/bin路径,它会自己去PATH中找。
当我们把自己的可实行文件的路径添加到PATH中时,我们实行时也就不必要再带路径了
以是可以如许:PATH = $PATH(原有路径) : 我的路径,将自己的路径添加到PATH中。
https://i-blog.csdnimg.cn/direct/f6e045206c424f33a91ffd58d6d1aec1.png
但是一旦退出shell,我们所添加的路径就没有了。
以是,PATH的本质:就是一个内存条理的变量,在shell中被维护起来,一旦shell退出再登录,该PATH就不会是我们修改后了,恢复成原有路径了。
那么PATH中最开始的内容是从哪里来的呢?
   shell登陆时,会从体系和用户的配置文件中读取对应的环境变量的配置文件,然后形成自己的环境变量表。
以是我们可以将路径添加到配置文件中(家目次下的bashrc)。
https://i-blog.csdnimg.cn/direct/3a308ed415144a0da750b0f072bb1330.png
2.2 HOME

HOME:当前用户所对应的家目次(即用户登陆到Linux体系中时,默认的目次)
当我们使用不同的用户登录的时候,体系要创建bash给我们做准备,bash要读取相关的配置文件来初始化PATH、HOME,以是我们登陆时会默认处在家目次下。
bash也是一个进程,以是它有自己的cwd,它就会使用配置好的HOME设置自己的cwd。
https://i-blog.csdnimg.cn/direct/c3859d6a811f459dabb1a8b6898fc736.png
命令行实行的命令,都是bash的子进程,那子进程的task_struct从哪里来呢? - - 拷贝自父进程,以是子进程的cwd也就会继承bash当前的工作路径。
如果bash在不同的工作路径下,当它创建子进程时,路径就会被子进程继承,以是在查看子进程的路径时也会发生变化,子进程所有的操纵都是在所继承下来的路径中。
https://i-blog.csdnimg.cn/direct/d3de4fa117eb4c06a1248135ceec6fb3.png
2.3 SHELL

SHELL : 登录时,启动的是哪一个Shell,它的值通常是/bin/bash
2.4 PWD

   PW:用于保存当前进程所在的工作路径
除了使用命令函参数获取环境变量以外,还使用体系方式获取环境变量:getenv()
https://i-blog.csdnimg.cn/direct/f7f11f617eed468b915000696b0e3638.png
https://i-blog.csdnimg.cn/direct/b5b87cf1f121493db34710e885716674.png
为什么要得到该环境变量呢?- - 进程可得到自己的PWD,可用于新建或打开当前路径下的文件
2.5 USER

USER:当前的用户身份
https://i-blog.csdnimg.cn/direct/09efbefd6911450c86e81dda7bc1eb93.png
此时我们就可以在步调中使用getenv(“USER”)来识别用户身份。
环境变量另有许多,后续慢慢先容。
3. 明白环境变量


[*]环境变量的本质
其实环境变量就是一张表,表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
https://i-blog.csdnimg.cn/direct/452b066dfc2449eead94223219a24646.png

[*]环境变量是体系提供的具有“全局”属性的变量
在命令行中,我们是可以界说变量的,但这些变量不是环境变量,是shell维护的,是本地变量。
https://i-blog.csdnimg.cn/direct/30c59e8f40e5451088ad024ca4dc643e.png
那如何查体系中所有的变量呢?- - set命令
如何将一个本地变量变成环境变量呢? export + a(先界说变量) / export a=100(不用界说,直接导)
https://i-blog.csdnimg.cn/direct/6ede6fcbdb0c4ceb8a9a0a688ba3ed16.png
一旦一个变量被设置进环境变量表后,它就可以被其它进程访问。

[*]子进程会继承父进程的环境变量表和命令行参数,不会继承本地变量表
https://i-blog.csdnimg.cn/direct/3b14a84744134e4cbecc307a8cbbd318.png
在子进程中,可以得到父进程的环境变量,也可以取消一个环境变量。
使用:unset + 环境变量名
https://i-blog.csdnimg.cn/direct/e2d44c26b7574ce3b2499ce3b8de480a.png
既然环境变量可以被子进程继承,那它一定也就能被子进程的子进程继承。也就是说环境变量可以被bash之后所有的进程看到,这不就相当于“全局变量”吗?
https://i-blog.csdnimg.cn/direct/f33a89822acb46edad190e9210c06066.png
上图中,子进程确实可以看到ISRUNNING,以是环境变量具有“全局属性”。
除了使用命令行参数env,getenv(),体系中提供了一个第三方变量environ指向环境变量表,environ没有包含在任何头文件中,以是在使用时要用extern声明。
https://i-blog.csdnimg.cn/direct/7055485011b34506b3c8b84132770078.png
https://i-blog.csdnimg.cn/direct/d1880fe794684bab9eb064ed96978392.jpeg#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Linux】环境变量(初步熟悉环境变量)