【Linux】环境变量(初步认识环境变量)
文章目录
- 1. 环境变量
- 1.1 基本概念
- 2. 认识常见环境变量
- 2.1 PATH
- 2.2 HOME
- 2.3 SHELL
- 2.4 PWD
- 2.5 USER
- 3. 理解环境变量

1. 环境变量
在main函数的命令行参数中,有argc、argv、env三个参数。
- argc:命令行参数的个数
- argc:存放每个参数的具体数值
通过这两个参数,我们可以根据传进来的参数做出判断,来进行相对应的操作,进而达到指令带选项的效果
那第三个参数env是什么呢?- - 环境变量
我们打印出了env中所有的数据,就是环境变量。
1.1 基本概念
环境变量(environment variables):一般是指在操作系统中用来指定操作系统运行环境的一些参数,将来会以shell的形式传递给所有进程,每个进程都会认识这些参数。
- 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,而且在系统当中通常具有全局特性。
常见的环境变量有哪些呢?
使用命令env可显示shell自己的环境变量。
2. 认识常见环境变量
2.1 PATH
PATH:指定命令的搜索路径
大家在敲指令的时候有没有过这样的问题:为什么我自己写的可执行程序执行时要 ./ 指定路径,而执行系统命令时就不用带指定路径呢?
系统在执行指令的时候会去/usr/bin路径下去找
但是系统为什么会知道命令在/usr/bin路径下呢?
在shell登录的时候,环境变量PATH
告诉shell去哪个路径下去查。
- 使用
echo 命令
可以显示某一个环境变量 echo $PATH
- PATH中包含多个路径,以冒号作为分隔符
因此,在shell运行某个命令时,它首先会去PATH中以冒号作为分隔的多个路径下去查找命令。当把PATH中所要求的路径全部找完,依旧没有找到的情况下,就会报出command not found;一旦在任意路径下找到命令,就会将命令加载并执行。
所以我们在执行系统命令时不需要指定/usr/bin路径,它会自己去PATH中找。
当我们把自己的可执行文件的路径添加到PATH中时,我们执行时也就不需要再带路径了
所以可以这样:PATH = $PATH(原有路径) : 我的路径
,将自己的路径添加到PATH中。
但是一旦退出shell,我们所添加的路径就没有了。
所以,PATH的本质:就是一个内存层次的变量,在shell中被维护起来,一旦shell退出再登录,该PATH就不会是我们修改后了,恢复成原有路径了。
那么PATH中最开始的内容是从哪里来的呢?
shell登陆时,会从系统和用户的配置文件中读取对应的环境变量的配置文件,然后形成自己的环境变量表。
所以我们可以将路径添加到配置文件中(家目录下的bashrc)。
2.2 HOME
HOME:当前用户所对应的家目录(即用户登陆到Linux系统中时,默认的目录)
当我们使用不同的用户登录的时候,系统要创建bash给我们做准备,bash要读取相关的配置文件来初始化PATH、HOME,所以我们登陆时会默认处在家目录下。
bash也是一个进程,所以它有自己的cwd,它就会使用配置好的HOME设置自己的cwd。
命令行执行的命令,都是bash的子进程,那子进程的task_struct从哪里来呢? - - 拷贝自父进程,所以子进程的cwd也就会继承bash当前的工作路径。
如果bash在不同的工作路径下,当它创建子进程时,路径就会被子进程继承,所以在查看子进程的路径时也会发生变化,子进程所有的操作都是在所继承下来的路径中。
2.3 SHELL
SHELL : 登录时,启动的是哪一个Shell,它的值通常是/bin/bash
2.4 PWD
PW:用于保存当前进程所在的工作路径
除了使用命令函参数获取环境变量以外,还使用系统方式获取环境变量:getenv()
为什么要获得该环境变量呢?- - 进程可获得自己的PWD,可用于新建或打开当前路径下的文件
2.5 USER
USER:当前的用户身份
此时我们就可以在程序中使用getenv(“USER”)来识别用户身份。
环境变量还有很多,后续慢慢介绍。
3. 理解环境变量
- 环境变量的本质
其实环境变量就是一张表,表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
- 环境变量是系统提供的具有“全局”属性的变量
在命令行中,我们是可以定义变量的,但这些变量不是环境变量,是shell维护的,是本地变量。
那如何查系统中所有的变量呢?- - set
命令
如何将一个本地变量变成环境变量呢? export
+ a(先定义变量) / export a=100(不用定义,直接导)
一旦一个变量被设置进环境变量表后,它就可以被其它进程访问。
- 子进程会继承父进程的环境变量表和命令行参数,不会继承本地变量表
在子进程中,可以获得父进程的环境变量,也可以取消一个环境变量。
使用:unset + 环境变量名
既然环境变量可以被子进程继承,那它一定也就能被子进程的子进程继承。也就是说环境变量可以被bash之后所有的进程看到,这不就相当于“全局变量”吗?
上图中,子进程确实可以看到ISRUNNING,所以环境变量具有“全局属性”
。
为什么环境变量要具有全局属性呢?
- 系统的配置信息,尤其是具有“指导性”的配置信息,如果进程可以使用该信息,那不就是配置生效吗?所以环境变量是系统配置生效的一种表现。
- 由于进程具有独立性,所以如果进程间向传递信息,可以通过环境变量来传递数据(只读的)
除了使用命令行参数env,getenv(),系统中提供了一个第三方变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
相关文章:

【Linux】环境变量(初步认识环境变量)
文章目录 1. 环境变量1.1 基本概念 2. 认识常见环境变量2.1 PATH2.2 HOME2.3 SHELL2.4 PWD2.5 USER 3. 理解环境变量 1. 环境变量 在main函数的命令行参数中,有argc、argv、env三个参数。 argc:命令行参数的个数argc:存放每个参数的具体数值…...

79. 单词搜索
思路 每次以当前位置为初始位置开始遍历,看是否找到单词 (以官方题解做出) v:代表等于work[k]且已走过的位置 d:四个方向 回溯(遍历): 匹配不上:终止 找到了:终止(先…...
[单master节点k8s部署]28.Istio流量管理(四)
金丝雀发布实验 部署两个pod,他们分别是canary-v1和canary-v2。 随后进行service的部署: apiVersion: v1 kind: Service metadata:name: canary-svc34namespace: default spec:selector:apply: canaryports:- port: 80protocol: TCPtargetPort: 80进行…...

Windows 11 安装配置 Git 教程
目录 Git Windows 11 环境安装配置 Git Git Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。Git是目前世界上最流行的版本控制系统,广泛应用于软件开发中。 以下是Git的一些关键特…...

Go基础学习11-测试工具gomock和monkey的使用
文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…...
PHP基础教程
PHP基础教程 1. PHP简介 PHP是一种广泛使用的开源服务器端脚本语言,它特别适用于网页开发,并可嵌入到HTML中使用。 2. PHP环境搭建 Windows: 可以使用XAMPP或WAMP。Mac: 可以使用MAMP。Linux: 可以使用XAMPP或LAMP。 3. 第一个PHP程序 创建一个名为…...

Python或R时偏移算法实现
🎯要点 计算单变量或多变量时序距离,使用欧几里得、曼哈顿等函数量化不同时序差异。量化生成时序之间接近度相似性矩阵。使用高尔距离和堪培拉距离等相似度测量。实现最小方差匹配算法,绘制步进模式的图形表示。其他语言包算法实现。 &…...

华为云LTS日志上报至观测云最佳实践
华为云LTS简介 华为云云日志服务(Log Tank Service,简称 LTS),用于收集来自主机和云服务的日志数据,通过海量日志数据的分析与处理,可以将云服务和应用程序的可用性和性能最大化,为您提供实时、…...
Python--加载Hugging Face模型文件异常处理
尝试加载 Hugging Face 模型的配置文件时,无法从 https://huggingface.co 获取所需的 config.json 文件。这个错误通常是由于网络连接问题、访问受限或路径配置错误导致的。让我们一步步分析并解决这个问题。 可能原因及解决方案: 网络连接问题…...
补码加/减运算的具体示例
补码加法运算示例 示例:计算两个十进制数的和,35 18,假设使用8位二进制表示。 1、求原码: 35的原码:00100011 18的原码:00010010 2、求补码(对于正数,补码与原码相同࿰…...

macOS编译和运行prometheus2.54
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文详述了在macOS(M2芯片)上编译和运行prometheus2.54版本的过程,以及安装node_exporter和grafana并使用prometheus指标进行展示 本地…...
flume系列之:flume jmx页面导出flume、java进程等全部指标
flume系列之:flume jmx页面导出flume、java进程等全部指标 一、需求背景二、完整的jmx指标信息三、修改jmx指标导出规则四、启动jmx导出程序一、需求背景 目前jmx页面指标只导出了flume相关的指标,现在需要导出java相关的指标二、完整的jmx指标信息 主要有flume指标java进程指…...

(17)MATLAB使用伽马(gamma)分布生成Nakagami-m分布的方法1
文章目录 前言一、使用伽马分布生成Nakagami分布随机变量的方法一二、MATLAB仿真代码后续 前言 MATLAB在R2013a版本中引入Nakagami分布对象,可以用来生成Nakagami随机变量。但是在更早的MATLAB版本中,并没有可以直接生成 Nakagami分布的随机变量的内置的…...
NFT 是什么?
NFT 是什么? NFT,全称Non-Fungible Token,即“非同质化代币”,是一种基于区块链技术的独特数字资产。NFT的核心特性在于其唯一性、不可分割性和不可替代性,这使其与传统的加密货币(如比特币、以太坊等)形成了鲜明的对比。比特币等加密货币是同质化的,每个单位之间可以…...

mysql的学习
垂直连接union join是水平连接,UNION 是垂直连接,它是把两张表的结果集按列堆叠,行数增加了,但列数保持不变。 UNION 垂直连接的作用 在 MySQL 中,UNION 可以将两个具有相同列数且列数据类型兼容的查询结果合并在一…...

微服务之间的相互调用的几种常见实现方式对比
目录 微服务之间的相互调用的几种实现方式 一、HTTP HTTP/RESTful API调用工作原理 二、RPC 设计理念与实现方式 协议与传输层 RPC远程调用工作原理 应用场景与性能考量 特点 三、Feign 设计理念与实现方式 协议与传输层 Feign调用的基本流程 Feign调用的工作原理…...
FPGA时序分析和约束学习笔记-(1、FPGA基本原理)
FPGA时序分析和约束学习笔记-(1、FPGA基本原理) Field现场Programmable可编程Gate门Array阵列 1、FPGA基本资源组成 可编程逻辑功能块(logic elements ,缩写LE) 片内互联线(interconnect,缩写…...
华为仓颉语言入门(9):for-in表达式
for-in 表达式用于遍历序列,它会依次访问序列中的每个元素,直到遍历完成。它常用于处理列表、数组或其他集合类型,能够有效简化代码,减少重复劳动。其基本语法如下: for (循环变量 in 序列) {循环体 }在 for-in 表达式中,每次循环都会检查是否遍历了序列中的所有元素。如…...

Vue3中使用axios
Promise介绍 同步代码与异步代码 安装并引入axios npm install axios 此时package.json里面就多了axios依赖 引入axios 获取数据 Axios GET参数构成:axios.get(url,{config{},…{}…}) url: 字符串:目标服务器的地址,如 https://api.examp…...
国创——VR虚拟陪伴
VR虚拟陪伴 1.技术基础:利用VR技术创建虚拟人物,实现与用户的互动。 2.功能实现:在用户等待就诊或无聊时,可以启动VR虚拟陪伴功能,与虚拟人物进行聊天、唱歌等互动,缓解用户的紧张情绪。 3.创新点&#…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...