Linux环境变量

一、环境变量是什么?

Windows系统中存在环境变量,就是在安装一个软件时会给它配置环境,也就是给他们添加环境变量,如python,java等编辑器时需要添加环境变量。系统环境变量也是可以添加的。
在这里插入图片描述
环境变量是在操作系统中维护的一组key value值,环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。这些参数是什么?参数其实很多都是自己设置的。其实就是将其存放在某个路径下,然后要执行的时候找到它所在位置就可以执行了。那为什么在运行自己写的程序时需要加./才可以运行而是命令行指令就不需要加,直接就可以执行,因为就是他所在的路径存放在环境变量中了,当要执行的时候就去环境变量所在路径中查找。指定命令搜素路径PATH,它存储许多环境变量路径,环境变量查看用echo $环境变量名
在这里插入图片描述
shell会在一个个路径中去寻找指令,找到的话就会执行它所在路径下的程序,如pwd
在这里插入图片描述
但是若不是系统环境变量中存在,在每一个路径下都是不存在的,就会提示不存在这个指令

在这里插入图片描述
那么可以将自己写的程序路径添加到环境变量,这样就可以不用带./
在这里插入图片描述
不能这样直接添加,因为这样是直接覆盖式的添加环境变量路径会将自己以前的环境变量路径给覆盖导致只有他自己的路径,覆盖式写入会导致系统中所有指令几乎都不能执行。那么如何将这些路径回复过来,其实用不着你管,因为PATH环境变量在shell中保存,若是无命令行那么PATH环境变量从系统中来,从系统中配置文件加载到PATH到内存中来,所有可以直接选择重新启动shelle即可。
而是应该PATH=$PATH:自己要添加指令的所在路径名
在这里插入图片描述
这样就可以让自己的程序像指令那样去执行。

查看bash进程中所有环境变量
env
在这里插入图片描述

二、环境变量获取

存在各种各样的环境变量各自有各自的作用。
环境变量可以通过指令查看,但是有一天若是在编写程序时想要获取某个环境变量应该如何做到?Linux用c语言实现,为其提供了一个获取环境变量的库函数getenv
在这里插入图片描述
它只需要给它传递想要知道的环境变量是什么就会给你返回想要知道的环境变量
在这里插入图片描述
在编写程序时环境变量也不只是通过库函数才能获取,可以通过命令行传过来,然后可以获取。main函数也是可以有参数的,int main(int argc,charargv[],charenv[]){},它也是可以被其他调用,第一个参数表示有多少个以空格隔开的命令行指令,在同一命令行中,将一个字符串打散成了几个
在这里插入图片描述

在这里插入图片描述
argv会接收来自命令行上的参数内容,就相当于shell上的指令就是实参,然后传递给argv。那么这么做意义何在?可以模拟命令行参数,实现命令行指令的选项执行不同功能更助于理解命令行。
在这里插入图片描述
指令带选项执行不同的功能。
在main函数参数列表还可以有一个参数,char*env[],这个参数是可以获取到shell中所有的环境变量
在这里插入图片描述
在这里插入图片描述
env和shell命令行打印出来的是一样的,在c/c++中存在两张表,一张是环境变量表,一张是命令行参数表,环境变量表存放进程所有的环境变量,而命令行参数表是在命令行上的一些指令。

三、环境变量全局属性

在我们所运行的进程,在命令行下的进程都是命令行bash的子进程,而bash在启动的时候会从操作系统的配置文件中读取环境变量信息,而bash下的子进程在执行时也会读取bash进程的环境变量信息,其实就是继承,bash在创建子进程时,子进程什么也没有,就从bash进程中将它的所有东西都拷贝了一份,从bash进程中继承下去,环境变量就是其中之一(bash构建环境变量表,然后若是它创建子进程,而子进程也会在创建时有一张环境变量表,然后创建时将环境变量信息填入子进程环境变量中。这样环境变量存在了全局属性,而在之后再创建子进程的过程中,每一个子进程都会进程它父进程的环境变量信息,并且在之后的过程中,往下创建子进程中,继承下去的环境变量只会越来越多。
增加一个环境变量
在这里插入图片描述
但是这个明显不是环境变量,因为在命令行中单纯添加一个变量只是一个本地变量,就是只能它自己使用,就相当于程序中局部变量一样,而要将本地变量设置为环境变量,用export,将其导为环境变量
在这里插入图片描述
此刻在运行写的程序,也就有了这一个环境变量了,而若是觉得这个环境变量不妥,可以用指令unset取消环境变量在这里插入图片描述
而本地变量和全局变量去别,就和编写程序一样,本地变量在命令行直接定义,就只能它自己使用,不会被继承下去,只在bash内部有效。环境变量是具有全局属性是可以被继承下去,让其他进程看到并且能用的。那么如何能查到自己设置的本地变量,用set指令,可以查看所有的变量。
内建命令
在命令行上,也并不是所有的指令都会创建子进程的,就如echo,cd等等,他们不会去创建子进程,然后就不会有环境变量继承这一说法。
如在bash中定义一个本地变量,然后echo查看,却是能够查看出这个变量的值,而bash的子进程是无法知道这个值的,也可以证明echo不是由bash闯将的子进程,echo指令功能是会将写的内容回显到显示器上,他其实是bash内部自己执行的功能,很多时候,bash进程有把握做的事,获取不想交给别的进程执行的工作它是可以自己来完成的。在系统中命令分为两种:常规命令(通过创建子进程完成)、内建命令(bash不创建子进程,有自己亲自执行功能,相当于bash调用了自己写的或者操作系统提供的函数)
cd内建命令,bash进程会跳转到指定路径下。
在这里插入图片描述
那么在代码层面如何改变路径,用chdir,man查看
在这里插入图片描述
系统接口
在代码层面上更改自己所在路径
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
最后修改成功。子进程自己更改自己路径,其他进程是不知道的!

environ
man 查看,它是一个获取环境变量的第三方变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值