当前位置: 首页 > news >正文

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、小程序三端)

方案&#xff1a;使用u-parse的selectable属性 <u-parse :selectable"true" :html"content"></u-parse> 注意&#xff1a;u-parse直接使用是不兼容小程序的&#xff0c;需要对u-parse进行改造&#xff1a; 1. 查看u-parse源码发现小程序走到以…...

常见的几种Web安全问题测试简介

Web项目比较常见的安全问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击。它指的是恶意攻击者往Web 页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web 里面的html 代码会被执行&#xff0c;从而达到恶意用户的特殊…...

linux信号机制[一]

目录 信号量 时序问题 原子性 什么是信号 信号如何产生 引入 信号的处理方法 常见信号 如何理解组合键变成信号呢&#xff1f; 如何理解信号被进程保存以及信号发送的本质&#xff1f; 为什么要有信号 信号怎么用&#xff1f; 样例代码 core文件有什么用呢&#…...

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…...

Redis 集群(Cluster)

集群概念 Redis 的哨兵模式&#xff0c;提高了系统的可用性&#xff0c;但是正在用来存储数据的还是 master 和 slave 节点&#xff0c;所有的数据都需要存储在单个 master 和 salve 节点中。 如果数据量很大&#xff0c;接近超出了 master / slave 所在机器的物理内存&#…...

260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…...

Python打发无聊时光:3.实现简单电路的仿真

看到这个标题肯定有人会问&#xff1a;好好的multisim、 proteus之类的专门电路仿真软件不用&#xff0c;非要写一个简陋的python程序来弄&#xff0c;是不是精神失常了。实际上&#xff0c;我也不知道为什么要这么干&#xff0c;前两篇文章是我实际项目中的一些探索&#xff0…...

MyBatis-Plus:通用分页实体封装

分页查询实体&#xff1a;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为例来说一下&#xff0c;在安装好MySQL8.0版本的前提下&#xff0c;如何添加环境变量。 二、目的 添加环…...

学习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的类名 &#xff1a; 验证码生成器包名修改&#xff1a;...

相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…...

嵌入式面试:瑞芯微

文章目录 一、2024 秋招1.1 IIC的速率范围 &#xff1a;1.2 linux驱动子系统汇总 &#xff1a;1.3 linux关抢占情况汇总 &#xff1a;1.4 操作或者读写一个文件时&#xff0c;从用户态到内核态再到物理介质的流程(考点&#xff1a;虚拟文件系统) &#xff1a; 一、2024 秋招 1…...

【性能测试】分布式压测之locust和Jmeter的使用

受限于单台机器的配置问题&#xff0c;我们在单台机器上达不到一个很高的压测并发数&#xff0c;那这个时候就需要引入分布式压测 分布式压测原理&#xff1a; 一般通过局域网把不同测试计算机链接到一起&#xff0c;达到测试共享、分散操作、集中管理的目的。 选择一台作为…...

北斗网格位置码实战:从编码原理到Java实现(非极地)

1. 北斗网格位置码&#xff1a;为什么我们需要它&#xff1f; 当你打开手机地图查看自己的位置时&#xff0c;看到的通常是经纬度坐标。这种表示方式虽然精确&#xff0c;但在实际应用中却存在不少问题。比如在物流配送系统中&#xff0c;直接存储和查询经纬度数据效率很低&am…...

Kali桥接模式实战:从静态IP到动态DHCP的完整网络配置指南

1. 为什么需要桥接模式&#xff1f; 很多刚接触Kali Linux的朋友都会有这样的疑问&#xff1a;为什么虚拟机要配置桥接模式&#xff1f;简单来说&#xff0c;桥接模式让虚拟机就像一台真实存在的物理设备一样接入网络。想象一下你家里新买了一台电脑&#xff0c;插上网线就能直…...

终极CoreUI Bootstrap管理模板:5个导航组件实战技巧提升用户体验

终极CoreUI Bootstrap管理模板&#xff1a;5个导航组件实战技巧提升用户体验 【免费下载链接】coreui-free-bootstrap-admin-template coreui/coreui-free-bootstrap-admin-template: CoreUI-Free-Bootstrap-Admin-Template 是一套免费的Bootstrap 4/5管理模板&#xff0c;包含…...

SDMatte开源模型部署实录:从镜像拉取到首张图产出完整记录

SDMatte开源模型部署实录&#xff1a;从镜像拉取到首张图产出完整记录 1. 引言 SDMatte是一款面向高质量图像抠图场景的AI模型&#xff0c;特别适合处理主体分离、透明物体提取、边缘精修、商品图去背景等任务。对于玻璃、薄纱、羽毛、叶片等边缘细节复杂或半透明目标&#x…...

【专栏一:AI基础01】-【一张图讲清楚什么是大模型】

专栏一&#xff1a;AI基础入门-什么是大模型&#xff1f;大模型通俗解释大模型通俗解释 我们可以把大模型想象成一个超级大脑&#xff1a; 它在诞生之初&#xff0c;会先阅读人类海量的文字、知识、书籍、网页、对话&#xff0c;把所有信息消化成一套庞大的数学规律和语言逻辑&…...

终极指南:FNF PsychEngine游戏引擎完整功能解析与实战应用

终极指南&#xff1a;FNF PsychEngine游戏引擎完整功能解析与实战应用 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF PsychEngine是一款专为Friday Night Funkin游戏设…...

基于SEER‘S EYE的Java面试题智能解析与模拟面试实战

基于SEERS EYE的Java面试题智能解析与模拟面试实战 最近和几个正在找工作的朋友聊天&#xff0c;发现大家准备Java面试的过程都挺痛苦的。要么是面对网上浩如烟海的“八股文”不知道从哪开始&#xff0c;要么就是自己闷头刷题&#xff0c;缺少真实的对话反馈&#xff0c;心里没…...

ComfyUI IPAdapter Plus插件ClipVision模型加载故障排除指南

ComfyUI IPAdapter Plus插件ClipVision模型加载故障排除指南 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus 问题诊断&#xff1a;ClipVision模型加载失败的典型症状与成因分析 在ComfyUI工作流中集成…...

BilibiliDown高效使用指南:解决20个核心功能难题

BilibiliDown高效使用指南&#xff1a;解决20个核心功能难题 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/Bil…...

【秣厉科技】LabVIEW工具包——OpenCV 实战:Mat 类在工业视觉中的高效数据流转

1. Mat类&#xff1a;工业视觉的数据高速公路 在工业视觉系统中&#xff0c;图像数据就像流水线上的零件&#xff0c;需要快速准确地传递到各个处理环节。OpenCV的Mat类就是这条流水线上的传送带&#xff0c;而LabVIEW则是控制整个生产线的智能大脑。我第一次在半导体检测项目…...