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

Linux进程——Linux环境变量

前言:在结束完上一篇的命令行参数时,我们简单的了解了一下Linux中的环境变量PATH,而环境变量不只有PATH,关于更多环境变量的知识我们将在本篇展开!


在这里插入图片描述


本篇主要内容:
常见的环境变量
获取环境变量的三种方式
本地变量与环境变量
环境变量的配置文件
内建命令与常规命令

在这里插入图片描述


环境变量

  • 1. 初识环境变量
  • 2. 获取环境变量的方法
    • 2.1 方法一:getenv
    • 2.2 方法二:通过main函数
    • 2.3 方法三:全局变量environ
  • 3. 环境变量的配置文件
  • 4. 本地变量与环境变量
  • 5. 环境变量的全局性
  • 6. 内建命令与常规命令
  • 7. 总结

1. 初识环境变量

首先,我们先来了解一下什么是环境变量!

基本概念:

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 我们编写代码在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

而我们介绍几个比较常见的环境变量

常见环境变量:

  • PATH : 指定命令的搜索路径

  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

  • PWD : 记录当前路径,pwd就是调用了PWD环境变量

拓展:我们在登录xshell的时候系统其实会做以下操作:

  • 输入用户名,密码
  • 认证
  • 形成环境变量
  • 根据用户名,初始化HOME=/root,HOME=/home/…
  • cd $HOME

在Linux中环境变量有很多,我们可以使用指令来查看所有环境变量
指令:env

在这里插入图片描述
系统中会存在大量的环境变量,每一环境变量都有自己的用途来完成特定的功能!

2. 获取环境变量的方法

在Linux我们有很多种方法能够过去环境变量,这里我们简单介绍三种!

2.1 方法一:getenv

其实在Linux中我们有直接获取的函数:getenv()

在这里插入图片描述

我们来简单操作一遍:

  1 #include<stdio.h>2 #include<stdlib.h>3                                                                                                                                                                                        4 int main()5 {6     printf("PATH: %s\n",getenv("PATH"));7     return 0;8 }

在这里插入图片描述
这是最简单的一种获取环境变量的方式,让我们继续来介绍几种!


2.2 方法二:通过main函数

在我们查看环境变量时,其实他也是一个类似于命令行参数表的
在这里插入图片描述

系统在进行创建启动程序时,可以给进程(main)提供两张表:

  • 命令行参数表
  • 环境变量表

而这个环境变量表也是可以通过main函数来获取的

    1 #include<stdio.h>2 #include<stdlib.h>3 4 int main(int argc, char *argv[], char *env[])5 {6     int i = 0;7     for(i = 0; env[i]; i++)8     {9         printf("env[%d]: %s\n",i, env[i]);10     }11     return 0;12 } 

在这里插入图片描述

2.3 方法三:全局变量environ

最后要介绍的一种方法是全局变量environ

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<sys/types.h>4 #include<unistd.h>5 6 int main()7 {8     extern char **environ;9     int i = 0;10     for(i = 0; environ[i]; i++)11     {12         printf("%d: %s\n",i, environ[i]);                                                                                                                                              13     }14     return 0;15 }

在这里插入图片描述


3. 环境变量的配置文件

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程bash给我们传递的!

当我们将PATH环境变量置为空串时:在这里插入图片描述
我们发现有很多的指令都用不了了,但当我们重新登录之后,又可以恢复正常!

其实:我们直接更改的是bash进程内部的环境变量信息!每一次重新登陆,都会给我们形成新的bash解释器并且新的bash解释器自动从读取形成自己的环境变量表信息!

而它的实质其实是每次重新登陆都会读取系统自带的配置文件.bash_profile,配置文件中的内容,为我们bash进程形成一张环境变量表信息!
在这里插入图片描述
如果我们想让我们的环境变量能够保存可以直接在配置文件中更改,下面会讲!


4. 本地变量与环境变量

Linux中,我们可以在bash中直接定义环境变量
指令:变量名=内容

在这里插入图片描述
但是当我们在环境变量表里获取我们自定义的变量时,是获取不了的。使用env也获取不了刚才定义的环境变量

实际上: 我们用户自己定义的环境变量是本地变量

在这里插入图片描述

如果想要我们定义的环境变量我们该怎么办,这时我们需要一条新的指令
指令:export 变量名

有了export我们就可以将我们自定义的环境变量添加到bash上下文的环境变量中
在这里插入图片描述
除了这种写法,我们还可以直接省略成一步。
在这里插入图片描述


我们用export指令可以将自己写的环境变量添加到父进程bash的进程上下文中,但是如果我们重新登录后,之前导入的变量是否还会存在?

  • 答案很明显,我们变量之会被添加到内存中,并不会改变配置文件,所以重新登录后并不会被保存
  • 因此如果我们想让我们的环境变量能够保存可以直接在配置文件中更改

在这里插入图片描述

在这里插入图片描述


5. 环境变量的全局性

环境变量的全局性能够被所有进程获取

让我们先来看看下面这段代码:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<sys/types.h>4 #include<unistd.h>5 6 int main()7 {8     pid_t id = fork();9     if(id == 0)10     {11         // 子进程12         extern char **environ;13         int i = 0;14         for(i = 0; environ[i]; i++)15         {16             printf("%d: %s\n", i, environ[i]);17         }18     }19     sleep(4);                                                                                                                                                                          20     return 0;21 }

我们在程序中直接创建子进程,然后让父进程什么也不做,来测试一下子进程能否获取父进程的父进程bash的环境变量?
在这里插入图片描述
那我们自定义的本地变量能不能被子进程继承呢?

OUR_ENV=2004printf("OUR_ENV: %s\n",getenv("OUR_ENV")); 

在这里插入图片描述

在了解完环境变量的全局性时,我们现在再来看看本地变量和环境变量的区别:

  • 本地变量只在bash进程内部有效,不会被子进程继承下去
  • 环境变量通过让所有的子进程继承的方式,实现自身的全局性!

6. 内建命令与常规命令

我们在之前就提到过,bash中的指令可以直接使用,不用加./是因为存在环境变量PATH,所以我PATH置空后,这些命令就会失效
在这里插入图片描述
但是我们置空PATH后,pwd依然可以正常使用,这是为什么呢?到了这里我们有得引出新的概念:

Linux的命令分类:

  • 常规命令,shell fork让子进程成执行的
  • 内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量!

我们虽然让PATH挂掉了,但是我们并没有让shell挂掉,因此shell内部定义的变量我们依然可以正常使用

注意:echo也是一个内建命令

7. 总结

本篇我们了解环境变量,让我们来回顾一下和环境变量相关的命令:

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

环境变量的学习重在理解,细节比较多,而且有很多新概念,所以认真,细心的学习环境变量是很重要的。

谢谢大家支持本篇到这里就结束了,让我们期待下一篇的进程地址空间
在这里插入图片描述

相关文章:

Linux进程——Linux环境变量

前言&#xff1a;在结束完上一篇的命令行参数时&#xff0c;我们简单的了解了一下Linux中的环境变量PATH&#xff0c;而环境变量不只有PATH&#xff0c;关于更多环境变量的知识我们将在本篇展开&#xff01; 本篇主要内容&#xff1a; 常见的环境变量 获取环境变量的三种方式 本…...

SRM系统供应链库存协同提升企业服务水平

SRM系统供应链库存协同是一种以提高供应链整体效率和竞争力为目标的管理方法。它涉及到企业与供应商之间的紧密合作&#xff0c;以实现库存优化、成本降低、风险分担和灵活响应市场变化等目标。 一、SRM供应链库存协同的概念和特点 SRM供应链库存协同是指企业与供应商之间通过…...

Windows安全加固-账号与口令管理

在当今日益增长的网络安全威胁中&#xff0c;Windows系统的安全加固显得尤为重要。其中&#xff0c;账号与口令管理作为系统安全的第一道防线&#xff0c;其重要性不言而喻。本文将深入探讨Windows安全加固中的账号与口令管理策略&#xff0c;以确保系统的安全性和稳定性。 账…...

【数据库原理及应用】期末复习汇总高校期末真题试卷03

试卷 一、选择题 1 数据库中存储的基本对象是_____。 A 数字 B 记录 C 元组 D 数据 2 下列不属于数据库管理系统主要功能的是_____。 A 数据定义 B 数据组织、存储和管理 C 数据模型转化 D 数据操纵 3 下列不属于数据模型要素的是______。 A 数据结构 B 数据字典 C 数据操作 D…...

数据库加密数据模糊匹配查询技术方案

文章目录 前言沙雕方案内存加载解密密文映射表 常规做法实现数据库加密算法参考 分词组合加密&#xff08;推荐&#xff09; 超神方案总结个人简介 前言 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下&#xff0c;如何…...

jsSPA应用如何实现动态内容更新

JS SPA&#xff08;单页面应用&#xff09;应用的原理、优势以及例子如下&#xff1a; 原理&#xff1a; SPA应用的核心原理在于&#xff0c;它使用JavaScript动态地创建和更新DOM结构&#xff0c;而非通过传统的多页面跳转来呈现内容。当用户与应用程序交互时&#xff0c;SP…...

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…...

python 中如何匹配字符串

python 中如何匹配字符串&#xff1f; 1. re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 import re line"this hdr-biz 123 model server 456" patternr"123" matchObj re.matc…...

Windows 系统运维常用命令

目标&#xff1a;通过本文可以快速实现windows 网络问题定位。 ipconfig:查看本机网络配置情况 C:\Users\zzg>ipconfigWindows IP 配置以太网适配器 以太网:媒体状态 . . . . . . . . . . . . : 媒体已断开连接连接特定的 DNS 后缀 . . . . . . . :无线局域网适配器 本地…...

Springboot监听ConfigMap配置文件自动更新配置

背景&#xff1a; 最近调研使用k8s的ConfigMap来作为springboot项目的配置中心&#xff0c;需要实现热更新机制&#xff0c;避免pod重启影响业务。 ConfigMap作为挂载卷使用的时候可以更新pod中的配置内容&#xff0c;但是业务应用需要能监听并处理这些变更。我在测试的时候已…...

API安全机制

API安全机制包括两部分&#xff1a;数字签名、敏感信息加密。 一、数字签名 服务端使用客户端的消息签名验证客户端的身份。如果一个请求不包含签名或者签名验证失败&#xff0c;服务端将返回身份验证错误。它背后的技术是&#xff1a;数字签名技术。 1、待签参数准备 待签…...

接口性能测试 —— Jmeter并发与持续性压测!

接口压测的方式&#xff1a; 1、同时并发&#xff1a;设置线程组、执行时间、循环次数&#xff0c;这种方式可以控制接口请求的次数 2、持续压测&#xff1a;设置线程组、循环次数&#xff0c;勾选“永远”&#xff0c;调度器&#xff08;持续时间&#xff09;&#xff0c;这种…...

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址&#xff1a;https://www.downxia.com/downinfo/4…...

Spring-AOP

目录 一&#xff1a;什么是AOP 二&#xff1a;AOP快速入门 2.1导入AOP坐标 2.2定义dao接口和实现类 2.3定义通知类 2.4在配置类中进行Spring注解包扫描和开启AOP功能 2.5定义测试类测试结果 三&#xff1a;AOP工作流程 四&#xff1a;AOP的切入点表达式 4.1语法格…...

算法程序设计-快速排序

快速排序采用---分治策略 L |------x-------------| R 第一步确定分界点&#xff1a;q[l],q[(lr)/2],q[r]随机 第二步调整范围&#xff1a;L |--------<x|>x------------| R 第三步递归处理左右两端 两种做法&#xff1a; 第一种&#xff1a;暴力解决 另外定义两个…...

Jmeter用jdbc实现对数据库的操作

我们在用Jmeter进行数据库的操作时需要用到配置组件“JDBC Connection Configuration”&#xff0c;通过配置相应的驱动能够让我们通过Jmeter实现对数据库的增删改查&#xff0c;这里我用的mysql数据库一起来看下是怎么实现的吧。 1.驱动包安装 在安装驱动之前我们要先查看当前…...

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装&#xff0c;并且完成 环境变量 的配置&#xff0c;实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…...

springboot如何发送邮件,java如何发送邮件随机码作为验证

maven <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency> 然后java package com.metasoft.common.utils;import java.util.Properties;import javax.…...

使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

概述: 大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。 什么是LL…...

编译和链接(超详细)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 一、编译和链接实例 假设我们有一个名为main.c的C语言源文件&#xff0c;它包含了一个简单的Hello World程序。我们可以使用gcc编译器对该源文件进行编译&#xff0c;生成一个可执行…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...