【Linux系统】Linux环境变量:系统配置的隐形指挥官

news2025/6/13 9:00:05

。# Linux系列


文章目录

  • 前言
  • 一、环境变量的概念
  • 二、常见的环境变量
  • 三、环境变量特点及其相关指令
    • 3.1 环境变量的全局性
    • 3.2、环境变量的生命周期
  • 四、环境变量的组织方式
  • 五、C语言对环境变量的操作
    • 5.1 设置环境变量:setenv
    • 5.2 删除环境变量:unsetenv
    • 5.3 遍历所有环境变量:environ


前言

环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息。理解环境变量对于系统管理、软件开发都很重要。


一、环境变量的概念

环境变量是操作系统用来存储和传递与系统环境相关信息的一种机制,是以键值对形式定义的全局变量,供操作系统和应用程序读取和使用。
通常格式为:
当VALUE为多个时,以‘:’符号隔开

KEY=VALUE
  • KEY:变量名
  • VALUE:对应值

那么它究竟有什么作用呢?我们来看这个例子:
在这里插入图片描述
从上面我们可以看到存在一个可执行程序test,第一次我们执行它,程序并没有正常运行,当然都知道因为没有指定程序所在路径,所以程序不能正常运行,第二次指定了不就运行成功了,那么我们的指令在执行时为什么不用指定路径呢?在指令篇我们就介绍过,指令的本质就是一个写好的可执行程序,当时我们说,如果我们想要让自己写的,可执行程序,像指令一样直接运行,我们可以将程序拷贝到指令所在路径下:/usr/bin
那还是没有解释为什么指令可以直接运行,或者说bash是如何找到指令的可执行程序的呢?还有没有其他方法可以使我们的可执行程序像指令一样运行呢?接下来我们来认识一下本篇第一个环境变量:PATH
PATH是操作系统中最核心的环境变量之一,当我们在命令行输入一个命令时,操作系统会按照PATH中定义的目录依次搜索该命令对应的可执行文件,若未找到该命令对应的可执行文件就会提示:command not found
查看PATH

echo $PATH

在这里插入图片描述PATH环境变量对应多个值,使用“:"隔离开

所以当我们将自己写的可执行文件,拷贝到/usr/bin路径下,系统在PATH对应的目中就可以找到。
还有什么方法可以解决这里的问题呢?只需要将我们自己写的可执行程序所在路径添加到PATH环境变量中,不就也可以完成搜索了

PATH=$PATH:/home/ltn/dir

在这里插入图片描述
在这里插入图片描述
刚才的test于前面路径存在的,可执行程序重名了,所以又换了个程序给大家演示,但这恰恰说明了系统是从第一个路径向后搜索程序的。

我们使用which查找指令时,就是在PATH环境变量中搜索的,所以现在我们就可以像查找指令一样查找我们自己的可执行程序了。
在这里插入图片描述

二、常见的环境变量

环境变量… 作用对应VALUE
HOME当前用户的主目录路径/home/ltn
USER当前登录用户名ltn
PWD当前工作目录路径/home/ltn
HISTSIZE记录历史指令最大数10000

查看环境变量:

查看所有环境变量:
env
查看指定环境变量:
echo $环境变量名

仅是截取的一部分
在这里插入图片描述

三、环境变量特点及其相关指令

为了方便接下来的讲解,我先带大家认识一个关于环境变量的系统调用接口:
在这里插入图片描述
头文件:#include<stdlib.h>
参数:环境变量名
返回值:如果存在则返回一个指向环境变量名的指针,否则返回NULL

3.1 环境变量的全局性

环境变量最开始是在我们登录xshell时,操作系统给bash形成的,当我们执行某些指令时,bash会创建子进程,并且将环境变量继承下来(当然会做某些修改),简单来说:环境变量是子进程从父进程那里继承下来的。
接下来我们验证一下!!!
创建我们自己的环境变量:

export ltn =”1234“

在这里插入图片描述
我们在当前bash进程定义了一个环境变量,如果子进程会继承父进程的环境变量,则可以打印出结果,否则程序什么都不输出。

  1 #include<stdio.h>  
  2 #include<unistd.h>  
  3 #include<stdlib.h>  
  4 int main()  
  5 {  
  6   printf("子进程的ltn->%s\n",getenv("ltn"));                                                                                      
  7   return 0;                                           
  8 }

在这里插入图片描述
可以看到程序成功打印,所以子进程会继承父进程的环境变量。

3.2、环境变量的生命周期

  • 环境变量的生命周期与进程绑定
  • 进程终止时,环境变量也会被回收

正是有了继承的这种形式,我们之前所提到的权限概念,才会被每条指令遵守。
删除环境变量:

unset ltn

在这里插入图片描述

四、环境变量的组织方式

我们之前在学习的C语言,不知道你有没有听过main函数的参数:

int main(int argc, char *argv[], char *env[])

第三个参数我们先不验证

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

这样一段代码,当我们执行它时,结果会怎么样呢?
在这里插入图片描述
在这里插入图片描述
可以看到我们以上面两种不同的方式执行,程序打印出了两种不同的结果,要知道怎么会这样,我们还是要知道参数是什么意思:

参数一 argc

  • 作用:记录命令行参数的数量
  • 规则:
  • 1、argc的值至少为1,因为第一个参数始终是程序自身的名称。
  • 2、用户输入的每个参数(以空格分隔)都会增加argc的值。

参数二 argv

  • 作用:存储命令行参数的具体值(用空格分开的代表不同参数),以字符串数组的形式表示
  • 规则:
  • 1、argv[0] 是程序名称(可能包含路径,取决于调用方式)。
  • 2 、argv[1]argv[argc-1] 是用户输入的参数。
  • 3、 argv[argc] 是一个空指针(NULL),表示数组结束。

参数三、env

  • 作用:指向系统的环境变量数组(从bash那继承的),每个元素是 KEY=VALUE 格式的字符串。

  • 规则

  • 1、 环境变量数组以 NULL 结尾。

  • 2、可以通过 getenv() 函数更安全地获取特定环境变量。

当知道了main函数的这些参数,我们就可以理解,为什么同一个指令加上不同的选项会有不同的功能了:当你在执行指令是带上不同参数,它就会存入到argv数组中,然后通过if else语句匹配不同代码块。实现不同功能。

五、C语言对环境变量的操作

5.1 设置环境变量:setenv

在这里插入图片描述
头文件:#include<stdlib.h>
参数:

  1. name:设置的环境变量名
  2. value:设置的环境变量值
  3. overwrite:是否覆盖已有值(非零表示覆盖)

示例:

    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 int main(int argc, char *argv[], char *env[])
    5 {
    6   if(setenv("ltn","Hell Linux",0)==0);
    7   {
    8     printf("ltn set to->%s\n",getenv("ltn"));                                                                                   
    9 
   10   }
   11   return 0;
   12 }

在这里插入图片描述

5.2 删除环境变量:unsetenv

在这里插入图片描述

头文件:#include<stdlib.h>
参数:

  1. name:环境变量名

示例:

    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 int main(int argc, char *argv[], char *env[])
    5 {
    6   if(setenv("ltn","Hell Linux",0)==0);
    7   {
    8     printf("ltn set to->%s\n",getenv("ltn"));
    9 
   10   }
   11   unsetenv("ltn");                                                                                                              
   12   printf("ltn->%s\n",getenv("ltn"));                                                                       
   13   return 0;                                                                                                
   14 }  

在这里插入图片描述
创建好,并删除

5.3 遍历所有环境变量:environ

在这里插入图片描述
environ是一个全局变量,内部存有所有环境变量的指针,,末尾指针指向NULL,具体介绍太长,不方便展示,大家可以自己看。
示例:

    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 extern char**environ;
W>  5 int main(int argc, char *argv[], char *env[])
    6 {
    7   char **env1=environ;
    8   while(*env1)
    9   {
   10     printf("%s",*env1);
   11     env1++;                                                                                                                     
   12   }
   13 
   14   return 0;
   15 }

在这里插入图片描述
仅截取部分打印结果
下面我们来说一下第三给参数,第三参数,是一个环境变量数组,也就是说,我们可以通过直接变量得到全部环境变量:

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

在这里插入图片描述
本篇就先到这里,看完给个三连吧!!!

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

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

相关文章

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…

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

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

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…