【进程概念】环境变量PATH(结合代码,超极容易理解)

news2024/9/28 19:25:05

文章目录

  • 什么叫环境变量
  • 常见环境变量
  • 查看环境变量
  • 测试PATH
    • 修改PATH
  • HOME
  • 和环境变量相关的命令
  • 环境变量是如何被组织的
  • 解释main函数里的参数
  • 如何在程序中获得环境变量
    • 1.命令行第三个参数
    • 2.通过第三方变量environ获取
  • 通过系统调用putenv和getenv获取或设置环境变量
  • 环境变量通常是具有全局属性的
  • 普通变量与环境变量的区别

什么叫环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

这也是为什么我们用xshell登录账号的时候会默认的工作目录是家目录。每个用户的家目录也是环境变量。

还有我们执行可执行程序时需要在前面加上路径,而指令却不用。按理来说,大部分指令也都是程序,执行后也会创建新的进程,那为什么我们使用类似ls这样的指令不需要在前面加上路径呢?这也是因为这些命令使用了环境变量中的PATH,是系统默认的命令路径,所以不需要用户指定路径(指定也可以)。

再比如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找

我们可以对环境变量有初步的理解,环境变量通常具有某些特殊用途,在系统当中通常具有全局特性.

常见环境变量

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

查看环境变量

使用printenv或者env指令查看当前系统所有的环境变量
在这里插入图片描述
使用echo $name 指令查看变量为name的值
在这里插入图片描述

测试PATH

既然我们知道,指令可以直接执行是因为这些指令环境变量PATH里面已经包含了指令的路径,执行指令之前会在PATH里提供的路径里面去寻找。PATH 变量是一个由冒号分隔的路径列表,每个路径都指向包含可执行文件的目录。

那我们自己创建的二进制可执行文件是否也可以不需要指定路径直接执行呢?

给出测试代码
在这里插入图片描述
如果我们想执行程序只能在可执行文件之前添加路径:
在这里插入图片描述
不加路径就会报错
在这里插入图片描述

修改PATH

方法一:
将我们的程序所在路径加入环境变量PATH中,使用指令
export PATH=$PATH:test1程序所在路径

命令export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登录操作

在这里插入图片描述

在这里插入图片描述
这样一来我们就可以直接运行我们的可执行程序test1了
在这里插入图片描述
值得注意的是 由于export的作用效力在下一次登录就失效了,是临时的
这是因为每次登录我们的PATH都会在文件 **/.bash_profile**里去加载。只有修改/.bash_profile里面的PATH才会永久生效
使用指令 sudo vim ~/.bash_profile编辑bash_profile文件
在这里插入图片描述
现在我们在bash_profile文件的PATH值后面添加我们的test1的路径
在这里插入图片描述
重新登录刷新PATH,之后就可以随时运行程序test1了
在这里插入图片描述

方法二:
将我们的程序拷贝到PATH里的路径就可以了,比如将test1拷贝到/usr/bin目录下,该目录存放的都是可以直接运行的指令。
在这里插入图片描述

HOME

记录当前用户的家目录
这也是为什么cd ~指令可以直接回到当前用户的家目录。
root用户的HOME
在这里插入图片描述
普通用户的HOME值
在这里插入图片描述

和环境变量相关的命令

1.env: 显示所有环境变量。
2.printenv: 打印指定的环境变量。
3 export: 设置或显示环境变量。
4.unset: 删除环境变量。
5.echo: 输出环境变量的值。
6.set:显示本地定义的shell变量和环境变量

环境变量是如何被组织的

每一个环境变量其本质就是一个以:区分键值对的字符串。:左边的是变量名字,右边是变量的值。
所有的环境变量都存放在一张表里面,这张表的每一个元素都是一个指针,指向一个表示环境变量的字符串。
当我们运行一个程序,就会收到一张来自父进程的环境表environ,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
在这里插入图片描述

解释main函数里的参数

像我们常用的ls -a指令或者是rm -rf指令,其中-a和-rf都被称为指令的选项。不同的选项表示程序不同的功能。这些选项在使用的时候会被传给main函数里的 argc,argv,argc就是表示参数的个数argv是一个指针数组,每一个元素指向一个参数(字符串)。(以上参数名称可以随便更改)

那我们可不可以使我们的程序也像指令一样带这些选项呢?
在这里插入图片描述
以上程序可以输出运行该程序时,选项个数以及选项信息。
在这里插入图片描述
由上我们可以观察到,argc以及argv实际上把指令本身也算进去了。我们的指令类似ls -a -l命令行带选项的原理也就是这样。根据分析命令行的参数来选择什么样功能,非常方便。

如何在程序中获得环境变量

观察以下代码
在这里插入图片描述
在这里插入图片描述

1.命令行第三个参数

当我们运行一个程序时,该程序可以看到该系统的环境变量表,其中main函数中的第三个参数就是记录着所有的环境变量(本质上是一个指针数组)。同样也可以在程序中输出观察。
在这里插入图片描述
在这里插入图片描述

2.通过第三方变量environ获取

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
在这里插入图片描述
在这里插入图片描述

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

在程序中,我们可以使用getenv(name)取得参数 name 环境变量的内容.
比如我们getenv(PATH)就可以得到环境变量PATH的值

在man手册中的getenv()函数介绍
在这里插入图片描述
同样,我们可以用putenv(char *string)用来改变或增加环境变量的内容
参数string 的格式为name=value, 如果该环境变量原先存在, 则该变量值置为value, 否则此参数内容会成为新的环境变量的键值对

在man手册我们可以看到该函数介绍
在这里插入图片描述

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

环境变量一般具有全局性,可以被子进程继承下去
首先导入一个环境变量
export MYENV="hello world"
在这里插入图片描述

在程序种使用getenv(“MYENY”)看是否能获取到
在这里插入图片描述
在这里插入图片描述
bash进程时test2进程的父进程,在bash进程中修改了环境变量,其子进程test2也会收到一份几乎一模一样的环境变量表,也就能找到我们刚才的变量MYENV了。

那么为什么子进程会继承父进程的环境变量表呢?
原因是子进程会拷贝父进程的几乎所有数据,其中就包含环境变量表
更详细讲解可以去看我之前的博客:
介绍了创建子进程的过程

普通变量与环境变量的区别

当我们不用export而是直接设置变量
在这里插入图片描述
这样设置的变量称为普通变量。
我们依旧可以使用echo $的方式输出变量的值。
通过env指令观察环境变量表我们发现key不在里面。说明普通变量不是环境变量。
那么普通变量跟环境变量有什么区别呢?
普通变量只会影响当前进程,并不会被子进程继承

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1541433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带3090显卡的Linux服务器上部署SDWebui

背景 一直在研究文生图,之前一直是用原始模型和diffuser跑SD模型,近来看到不少比较博主在用 SDWebui,于是想着在Linux服务器上部署体验一下,谁知道并没有想象的那么顺利,还是踩了不少坑。记录一下过程,也许…

画架构图实践技巧

画架构图是架构师的一门必修功课。 对于架构图是什么这个问题,我们可以按以下等式进行概括: 架构图 架构的表达 架构在不同抽象角度和不同抽象层次的表达,这是一个自然而然的过程。 不是先有图再有业务流程、系统设计和领域模型等&#…

ForkJoinPool在生产环境中使用遇到的一个问题

1、背景 在我们的项目中有这么一个场景,需要消费kafka中的消息,并生成对应的工单数据。早些时候程序运行的好好的,但是有一天,我们升级了容器的配置,结果导致部分消息无法消费。而消费者的代码是使用CompletableFutur…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为 6 6 6 时,开始情形如…

echarts 折线图 数据点过密,显示重叠该如何解决

echarts 折线图 数据点过密,显示重叠该如何解决 有这样一个图表,显示的数据比较多, 当把 label 显示出来的时候,这些 label 重叠了,我想让它间隔一下。 结果是这样的: 只需要在 label.formatter 上处理 …

Go 限流器-漏桶 VS 令牌桶 常用包原理解析

本文主要介绍两个包Uber漏桶,time/rate令牌桶 可以了解到: 使用方法漏桶/令牌桶 两种限流思想 and 实现原理区别及适用场景应用Case 背景 我们为了保护系统资源,防止过载,常常会使用限流器。 使用场景: API速率限制…

clickhouse突然启动不起来问题排查

场景: 在实现postgreql数据迁移到clickhouse中,想使用MaterializedPostgreSQL的功能实现,但是中途clickhouse突然挂了,就再启动不了了。 现象: systemctl start clcikhouse-server启动报错 [rootlocalhost clickhous…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册,主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中,注册后置处理器&a…

反序列化漏洞简单知识

目录: 一、概念: 二、反序列化漏洞原因 三、序列化漏洞的魔术方法: 四、反序列化漏洞防御: 一、概念: 序列化: Web服务器将HttpSession对象保存到文件系统或数据库中,需要采用序列化的…

基于java+springboot+vue实现的研究生志愿填报辅助系统(文末源码+Lw+ppt)23-600

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这…

java 实现发送邮件功能

今天分享一篇 java 发送 QQ 邮件的功能 环境&#xff1a; jdk 1.8 springboot 2.6.3 maven 3.9.6 邮件功能依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>&…

深度学习pytorch——多层感知机反向传播(持续更新)

在讲解多层感知机反向传播之前&#xff0c;先来回顾一下多输出感知机的问题&#xff0c;下图是一个多输出感知机模型&#xff1a; 课时44 反向传播算法-1_哔哩哔哩_bilibili 根据上一次的分析深度学习pytorch——感知机&#xff08;Perceptron&#xff09;&#xff08;持续更新…

pytorch 实现多层神经网络MLP(Pytorch 05)

一 多层感知机 最简单的深度网络称为多层感知机。多层感知机由 多层神经元 组成&#xff0c;每一层与它的上一层相连&#xff0c;从中接收输入&#xff1b;同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 softmax 实现了 如何处理数据&#xff0c;如何将 输出…

【Godot4.2】基础知识 - Godot中的2D向量

概述 在Godot中&#xff0c;乃至一切游戏编程中&#xff0c;你应该都躲不开向量。这是每一个初学者都应该知道和掌握的内容&#xff0c;否则你将很难理解和实现某些其实原理非常简单的东西。 估计很多刚入坑Godot的小伙伴和我一样&#xff0c;不一定是计算机专业或编程相关专…

WSL使用

WSL使用 WSL安装和使用 Termianl和Ubuntu的安装 打开Hype-V虚拟化配置Microsoft Store中搜索Window Terminal并安装Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本打开Window Terminal选择Ubuntu标签栏, 进入命令行 中文输入法安装 查看是否安装了fcitx框架…

2023第13届上海生物发酵展8月7-9日举办

2024第13届国际生物发酵产品与技术装备展&#xff08;上海展&#xff09; 2024年8月7-9日|上海新国际博览中心 主办单位&#xff1a; 中国生物发酵产业协会 承办单位&#xff1a; 上海信世展览服务有限公司 院校支持&#xff1a; 北京工商大学 大连工业大学 华东理工大…

FakeLocation报虚拟位置服务连接失败,请重启设备再试

虚拟位置服务连接失败&#xff0c;请重启设备再试 最近遇到一个手机软件报的bug“虚拟位置服务连接失败&#xff0c;请重启设备再试” 因为我的实体“虚拟机”已经root&#xff0c;按道理是不可能报这个错的 折腾了2天&#xff0c;终于解决了 原来是这样&#xff0c;安装最新…

React腳手架已經創建好了,想使用Vite作為開發依賴

使用Vite作為開發依賴 安裝VITE配置VITE配置文件簡單的VITE配置項更改package.json中的scripts在根目錄中添加index.html現在可以瀏覽你的頁面了 安裝VITE 首先&#xff0c;在現有的React項目中安裝VITE npm install vite --save-dev || yarn add vite --dev配置VITE配置文件 …

【MySQL】复合查询——基本单表查询、多表查询、自连接、子查询、使用from进行子查询、合并查询

文章目录 MySQL复合查询1. 基本单表查询2. 多表查询3. 自连接4. 子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 使用from进行子查询 5. 合并查询5.1 union5.2 union all MySQL 复合查询 数据库的复合查询是指在一个查询中结合使用多个查询条件或查询子句&#xff0c;以…

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁&#xff1b; 1.1.2 防止死锁 需要确保在任何故障场景下&#xff0c;都不会出现死锁&#xff1b; 1.2.3 可重入 特殊的锁机制&#xff0c;它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…