Linux------环境变量
目录
前言
一、环境变量
二、添加PATH环境变量
三、HOME环境变量
四、查看所有环境变量
1.指令获取
2.代码获取
2.1 getenv
2.2main函数的第三个参数
2.3 全局变量environ
五、环境变量存放地点
六、添加自命名环境变量
七、系统环境变量具有全局属性
八、环境变量与本地变量
九、环境变量相关的命令
前言
在前面我们学习了进程与命令行参数,了解到了指令的本质就是可执行程序,选项就是通过main函数参数argv来获取并处理的。但是系统的一些mkdir/ls/rm/pwd等指令,是不需要添加 ./ 来执行的,而我们自己写的程序需要添加 ./ 来指定路径执行(系统找不到)。
其实这都跟环境变量有关系,./ 的目的是从当前文件夹中去寻找程序。设置了环境变量后,系统就知道了程序的路径,会去你设置的路径里面寻找,如果存在,就开始运行了。
一、环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
想要执行一个程序,需要先找到这个程序的路径,系统的 ls/rm 等指令,可以不带路径直接执行,系统一定是有自己的默认搜索路径去找到这些可执行程序。环境变量会记录这些搜索路径,方便系统查找,包含搜索路径的环境变量我们称作 PATH。
我们可以通过如下指令查询系统的PATH环境变量
echo $PATH

这里我们可以看到,图片中有很多“:” 符号 ,这是用来分割路径的,有4个“:”证明有五个路径。linux的指令都在这些路径下,因此就可以直接运行。
二、添加PATH环境变量
我们自己写的代码如果想不指定路径,也需要将他放到PATH路径下才可以直接运行。如下这段代码。

我们想要执行需要再可执行程序前面加上指定路径。否则系统找不到会执行失败

这里我们可以直接给PATH赋值为我们的路径。

这样就可以直接运行了,但是又会让我们之前的环境变量消失,因此最好使用如下代码
PATH=$PATH:/home/kky/centos_test/109/240207_envir
/home以及后面的内容是我自己的路径,你需要设置为你自己的。

我们也可以将可执行程序拷贝到已经存在PATH路径下,这个过程叫做程序安装,这也是可以的。

需要注意更改环境变量,只限于本次登录,重新登录,环境变量会自动恢复。
三、HOME环境变量
在我们登录linux的时候可以看到,进入时默认都是root身份,root身份的家目录为/root,而切换普通用户家目录为/home/用户id

这是因为登录的时候会形成环境变量,不同的用户环境变量可能会不同

四、查看所有环境变量
1.指令获取
输入指令env可以只看所有环境变量
env
这里面有很多信息,比如HOSTNAME主机名字,SHELL外壳,HISISIZE历史命令条数,USER使用者等等

不同的用户环境变量也可能不一样
系统会存在大量的环境变量,每一个环境变量都有他自己的特殊用途,用来完成特定的系统功能。
2.代码获取
2.1 getenv
我们也可以使用C语言的getenv参数来获取环境变量,如下就是一种例子,判断必须是root用户才可以继续执行,否则就报错非法用户并退出。

运行结果如下

2.2main函数的第三个参数
在之前学的命令行参数,我们了解到main函数前两个参数int argc 和 char* argv[],今天重点学习第三个参数char* env[],其实这第三个参数本质就是环境变量,他将环境变量当做字符串放入这里。

我们可以将env里面的字符串打印出来看一下。

我们可以看到打印出的内容就是输入env指令看到的那些内容,main函数是如何获取到系统的环境变量的呢?
命令行启动的进程都是shell/bash的子进程,这是我们之前将进程和进程fork中提到过的,子进程的命令行参数和环境变量,是父进程bash给我们传递的。
2.3 全局变量environ
在头文件unistd.h中,有一个外置的二级指针environ变量,他指向着bash的环境变量表。

可以通过environ获取到系统环境变量,代码如下

make后运行

五、环境变量存放地点
在之前,我们还更改过环境变量,但是你可以发现,你更改环境变量后会立即生效,但是当你重启bash环境变量又会自动恢复,这是因为你修改的是内存中的环境变量,而环境变量是写到了磁盘的,每一次重新登录,都会给我形成新的bash解释器并且新的bash解释器会自动从磁盘中读取形成自己的环境变量表信息。
当我们进入家目录,输入ls-al指令,可以看到由一个文件叫做.bash_profile,这是bash配置文件,bash在启动的时候会自动读取该文件里面的内容并执行。

打开该文件里的内容可以看到PATH路径,同时在前面他还会执行~/.bashrc

我们再打开~/.bashrc,这也是在上面图片中的文件。同时他也包含了另一个文件,就这样一直读取这些文件里面的内容,bash就可以将环境变量给配置好。

现在我们应该理解了每一次登录,bash都会读取.bash_profile配置文件中的内容,为bash形成一张环境变量表信息。只要我们没有改过该配置文件,在命令行中修改一些环境变量,重启后都会恢复原样。
六、添加自命名环境变量
在命令行中,我们可以直接定义变量,如下,就定义了一个MYENV_TEST变量,内容为hellolinux。
MYENV_TEST=hellolinux
但此时环境变量里是没有该变量的,我们需要通过export进行导入。

我们重新启动shell后,我们之前设置的环境变量依然不存在,要想使他重启后仍然存在,需要将该命令写到对应的文件去,shell启动会自动读取文件里的内容进行配置。
依然是.bash_profile文件里,添加如下红线代码,这样重启后就存在该环境变量了。

七、系统环境变量具有全局属性
在之前,我们通过指令env获取了环境变量,我们还通过代码利用进程的方式获取到了环境变量,我们知道该进程的父进程是bash,因此该进程可以继承bash的环境变量表,并打印出来,那么该进程fork的子进程呢?是否也能打印出来环境变量。
代码如下

依然能运行。

这个结果证明系统环境变量具有全局属性。进程都可以继承系统环境变量。
八、环境变量与本地变量
bash中也可以赋值,在命令行中随意输入变量名赋值给某个值或者变量,这些变量统称为本地变量。

但本地变量只在bash进程内部有效,不会被子进程继承下去,而环境变量通过让所有的子进程继承的方式,实现环境变量的全局属性。
那么现在问题来了,echo不算进程吗,我们定义的abc本地变量,说好的不会被子进程继承,怎么echo可以打印呢?
这是因为linux大部分命令是在磁盘中真正存在的,需要由bash fork出子进程来执行的,比如ls top mkdir touch env等等。
但是有小部分命令为内建命令,比如echo export等,他们是内建命令,他是bash命令行的一个函数,当然可以直接读取bash内部定义的本地变量。
九、环境变量相关的命令
1. echo: 显示某个环境变量值
2.export: 设置一个新的环境变量
3.env: 显示所有环境变量
4.unset: 清除环境变量
5.set: 显示本地定义的shell变量和环境变量
相关文章:
Linux------环境变量
目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…...
计算机视觉所需要的数学基础
计算机视觉领域中使用的数学知识广泛而深入,以下是一些关键知识点及其在计算机视觉中的应用: 线性代数: - 矩阵运算:用于图像的表示和处理,如图像旋转、缩放、裁剪等。 - 向量空间:用于描述图像中的…...
ChatGPT魔法1: 背后的原理
1. AI的三个阶段 1) 上世纪50~60年代,计算机刚刚产生 2) Machine learning 3) Deep learning, 有神经网络, 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…...
【c/c++】获取时间
在一些应用的编写中我们有时候需要用到时间,或者需要一个“锚点”来确定一些数的值。在c/c中有两个用来确定时间的函数:time/gettimeofday 一、time time_t time(time_t *timer);time 函数返回当前时间的时间戳(自 1970 年 1 月 1 日以来经…...
uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
方案:使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意:u-parse直接使用是不兼容小程序的,需要对u-parse进行改造: 1. 查看u-parse源码发现小程序走到以…...
常见的几种Web安全问题测试简介
Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到恶意用户的特殊…...
linux信号机制[一]
目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢? 如何理解信号被进程保存以及信号发送的本质? 为什么要有信号 信号怎么用? 样例代码 core文件有什么用呢&#…...
elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)
文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时,出现如下问题:el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间),输出了两次如下 分析 在 el-date-picker 中,我们使用…...
Redis 集群(Cluster)
集群概念 Redis 的哨兵模式,提高了系统的可用性,但是正在用来存储数据的还是 master 和 slave 节点,所有的数据都需要存储在单个 master 和 salve 节点中。 如果数据量很大,接近超出了 master / slave 所在机器的物理内存&#…...
260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…...
Python打发无聊时光:3.实现简单电路的仿真
看到这个标题肯定有人会问:好好的multisim、 proteus之类的专门电路仿真软件不用,非要写一个简陋的python程序来弄,是不是精神失常了。实际上,我也不知道为什么要这么干,前两篇文章是我实际项目中的一些探索࿰…...
MyBatis-Plus:通用分页实体封装
分页查询实体:PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…...
MVC 、DDD(domain-driven design,软件主动学习业务)、中台、Java SPI(Service Provider Interface)
文章目录 引言I 单体架构DDD实现版本1.1 核心概念1.2 DDD四层架构规范1.3 案例1.4 请求转发流程II 领域服务调用2.1 菱形对称架构2.2 中台III Java SPI3.1 概念3.2 实现原理3.3 例子:本地SPI找服务see alsojava -cp<...
添加环境变量
目录 一、前言二、目的三、添加环境变量的步骤四、检查环境变量是否配置成功 一、前言 在很多地方在下载完软件后都需要添加环境变量方可使用。这里以要在终端使用MySQL为例来说一下,在安装好MySQL8.0版本的前提下,如何添加环境变量。 二、目的 添加环…...
学习Android的第十六天
目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorH…...
若依项目改造
ctrlalt l 格式化项目 alt f6 修改包和import包名 替换com.ruoyi 为 com.cj 替换若依版本为自己的版本 将ruoyi改成自己项目的英文名 修改中文名字 修改文件包名 修改有ruoyi的类名 : 验证码生成器包名修改:...
相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
算法学习系列(三十五):贪心(杂)
目录 引言一、合并果子(Huffman树)二、排队打水(排序不等式)三、货仓选址(绝对值不等式)四、耍杂技的牛(推公式) 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…...
嵌入式面试:瑞芯微
文章目录 一、2024 秋招1.1 IIC的速率范围 :1.2 linux驱动子系统汇总 :1.3 linux关抢占情况汇总 :1.4 操作或者读写一个文件时,从用户态到内核态再到物理介质的流程(考点:虚拟文件系统) : 一、2024 秋招 1…...
【性能测试】分布式压测之locust和Jmeter的使用
受限于单台机器的配置问题,我们在单台机器上达不到一个很高的压测并发数,那这个时候就需要引入分布式压测 分布式压测原理: 一般通过局域网把不同测试计算机链接到一起,达到测试共享、分散操作、集中管理的目的。 选择一台作为…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
