系统的环境变量

目录

基本概念

用途之一

环境变量表

命令行参数表

理解

更多的环境变量


基本概念

  • 环境变量(environmentvariables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。
  • 环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性

用途之一

我们看一个之前说到过的问题:

为什么直接敲指令可以直接运行,而我们自己写的程序却要写路径才能运行?

现象:


我们之前说只需要我们把自己的可执行文件放进/usr/bin/目录下就可以不带路径,但是为什么呢?

这是因为有环境变量。

有一个可执行文件,要运行它,必须要先找到它吧,我们带上路径就能执行,而不带却不能执行,但是系统中的指令却不用带就能执行,为什么?

系统中有一个名叫PATH的环境变量,帮助系统找到可执行的二进制文件!PATH中存着/usr/bin路径(当然不止这一个路径),系统会默认到PATH中的路径寻找输入的指令,如果查遍了PATH中的所有路径都没有查到输入的指令,那么就报错反馈给用户,如果查到了,执行即可!

查所有环境变量,指令:

复制代码
env

是以名称=内容的形式存放的。

查某个环境变量内容,指令:

复制代码
ehco $(需要查找的环境变量名)

可以将自己的可执行文件放到PATH路径中,但是我们也可以添加路径到PATH中,这样我们可以解决:

当我们把PATH路径全部修改掉,原来系统指令就执行不了了,但有些内命令能运行,这个内建命令我们后面讲:

我们修改后,不知道怎么恢复,可以直接退出重新登陆,即可恢复原样。

环境变量表

环境变量是怎么来的呢?怎么理解它?它是怎么被存储的?

我们登陆上去,bash从系统中的相关配置文件(shell脚本写的)读取,形成一张环境变量表(数组),也就是说系统中环境变量都在bash的这张环境变量表中!

如果同时登陆10个用户呢?也就是有10个bash,它们都会形成各自的环境变量表(从相关配置文件中读取的)。

环境变量表的存储:

将环境变量以字符串的形式存入环境变量表。

命令行参数表

除了环境变量表,其实还有一张命令行参数表!

在日常生活中,我们常常使用一些命令达不到我们的需求,所以指令一般都有一些参数来实现多功能的需求。

例:

理解:

在bash看来我们敲的一行行指令就是一个字符串,bash将这一个个命令参数切分,放入命令参数表中,通过表上的不同的命令参数执行不同的功能。

理解

直观的看命令行参数表:

命令行参数表其实就是个数组!(main函数最多有三个参数)

有这个命令参数表,我们可以将不同参数实现不同功能:

直观的看环境变量表:

环境变量表和命令行参数表一样是个数组!

综合理解:

我们一登陆,bash读取OS相关配置文件,填写形成环境变量表,当我们敲一个命令时,bash读取命令行,将命令行切分,填写形成命令行参数表,bash会在PATH环境变量的所有路径中,寻找这个指令,如果有,根据参数,运行这个多功能的指令!如果没有,报错给用户。也就是说bash会存在两张表。

有个问题:

这个myprocess进程是bash的子进程,我们说环境变量只是在bash中,怎么这个myprocess进程可以拿到呢?

我们开始讲概念的时候说过,环境变量是具有全局属性的,也就是说,bash中的环境变量表是被子进程继承的,别说子进程,哪怕是bash的孙子进程,曾孙进程也是继承的,具有全局特性!

理解:

我们以为程序的入口是main函数,其实,main函数上一层还有一个start函数,start函数调用main函数,只不过我们看不到start函数,只能看到main函数,所以才以为main函数是程序的入口。

main函数可以是0/1/3个参数,start将参数传入子进程main函数,也就是说start函数是将bash中的环境变量表,命令行参数表传入子进程main函数。

更多的环境变量

我们可以看到有很多个环境变量,现在我们来说说一些常见的。

HOME环境变量

我们可以看到当用户是root用户,HOME变量就是root的家目录,是普通用户,HOME变量就是普通用户的家目录,也就是说HOME变量存放的是当前用户的家目录。

其实就是因为有HOME变量才能迅速切换到当前用户的家目录。

SHELL环境变量

代表登陆时是用的哪个版本的bash。

USER环境变量

记录着是哪个谁登陆的。

HISTSIZE环境变量

我们知道我们可以查到我们输入的历史命令,但是只能查到最近的1000条,bash只会记录最近的1000条,因为默认情况下HISTSIZE设置成1000条。

存放着历史命令数量限制。

相关推荐
大白菜13241 天前
进程的信号
linux
XH-hui1 天前
【打靶日记】群内靶机Secure
linux·网络安全
Shingmc31 天前
【Linux】进程控制
linux·服务器·算法
视觉装置在笑7131 天前
Shell 变量基础与进阶知识
linux·运维
Web极客码1 天前
如何通过命令行工具检查 Linux 版本信息
linux·运维·服务器
Lynnxiaowen1 天前
今天我们继续学习Kubernetes内容pod资源对象
运维·学习·容器·kubernetes·云计算
欢鸽儿1 天前
Vitis】Linux 下彻底清除启动界面 Recent Workspaces 历史路径
linux·嵌入式硬件·fpga
繁华似锦respect1 天前
C++ 智能指针底层实现深度解析
linux·开发语言·c++·设计模式·代理模式
远程软件小帮手1 天前
云电脑挂机功能上线!边上班摸鱼边游戏多开教程
运维·服务器
hweiyu001 天前
Linux 命令:dd
linux