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

Linux系统 环境变量

环境变量

  • 写在前面
  • 概念
  • 查看环境变量
    • main函数的参数
      • argc & argv
      • env
  • bash环境变量

写在前面

对于环境变量,本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”,我们会更详细讲解;理解环境变量的全局属性 —— 环境变量是可以被子进程继承(注意区分 C++ 里的继承);环境变量的组织方式。其次会介绍命令行参数 —— main 函数的参数。

概念

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

我们在编写 C/C++ 代码的,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

LInux操作系统本身就是一个用C语言写的程序,操作系统可以在运行过程中开辟空间。环境变量的本质,就是在操作系统运行过程中,为自己开辟的空间,存储了一些重要的信息。

为了更好的理解环境变量的作用,现在我们先来思考一个问题,我们在执行指令的过程之中,可以直接输入指令的名字,但是我们自己写的可执行程序,一定要加上绝对路径或者相对路径才可以运行,这是为什么呢?

其实这个过程之中,环境变量的作用就显现出来了。

PATH:一个环境变量,存储着多个路径,在这些路径下面的可执行程序,可以直接执行。

PATH是我们讲解的第一个重要的环境变量,我们现在尝试观察这个环境变量。

echo $xxx:查看xxx环境变量的内容

在这里插入图片描述
可以看出这个环境变量是由多个路径组成的,每个路径由分开。
因此我们只需要把自己的可执行程序放在这里面某一个路径下面,我们自己写的可执行程序就也可以当作指令来执行了。而这个工作就是把自己写的软件安装到系统之中。

我们也可以想办法把自己的路径加到PATH环境变量中。

xxx=:修改环境变量的值

如果我们当前路径下有一个可执行程序test.exe并且我们将其路径加到了PATH中,那么我们就可以直接执行这个程序,但是原来PATH中的内容会被我们的修改直接覆盖。导致原有的ls,pwd,mkdir等等指令全部执行不了了。但是不用惊慌,我们只需要关闭xshell,然后重启,此时PATH就会恢复原先的值。

我们再来看看几个常用的的环境变量。

USER:记录当前的用户
PWD:记录当前路径
HOME:记录家目录

在这里插入图片描述

我们还可以自己定义一些环境变量:

export xxx=:定义xxx环境变量

在这里插入图片描述
不过我们自己定义的环境变量在重新启动的时候也会失效。

还有一个与环境变量相关的重要指令。

env:输出所有环境变量。

展示部分如下。
在这里插入图片描述

查看环境变量

通过之前的认识,我们知道可以通过env来查看所有的环境变量,也可以通过echo $xxx查看单个环境变量,但是这些都是在命令行中操作的,如果我们想在可执行程序中查看需要如何做呢?

  • getenv

getenv是一个函数,其定义在<stdlib.h>中。功能是:输入一个字符串作为参数,该函数输出该字符串对应的环境变量的内容。

当前test.exe程序内容如下:

#include <stdio.h>      
#include <stdlib.h>      int main()      
{      const char* path = getenv("PATH");      const char* home = getenv("HOME");      printf("PATH = %s\n", path);      printf("HOME = %s\n", home);    return 0;    
}      

在这里插入图片描述

main函数的参数

也许你或许听说过,main函数也是有参数的,但是在学习C/C++的过程中,这个参数好像可写可不写,学习环境后,我们就可以了解一下这些变量的意义是什么了。

argc & argv

main的前两参数分别是argc和argv,传参形式如下:

int main(int argc, char* argv[])  
{}

可见,argcint类型的变量,而argv是一个char*的数组。还记得我们刚刚的env指令内容吗?其实它们两个的结构是一样的。argv每个元素都是char*类型,分别指向一个字符串,argv的最后一个元素也是NULL,用于标识argv的数组结尾。而argc代表了argv中元素的个数,所以我们既可以通过NULL来判断argv结尾,也可以通过argc来判断结尾。在test中执行如下代码,来看看argv中存储了什么:

#include <stdio.h>      int main(int argc, char* argv[])      
{      for(int i = 0; i < argc; i++)      {      printf("argv[%d]: %s\n", i, argv[i]);      }    return 0;    
}        

在这里插入图片描述
现在argv中只有一个元素,即字符串"./test.exe"

给./test.exe加几个选项试试,./test.exe -a -b -c

在这里插入图片描述
可以得出argv参数内部,存储的是调用可执行程序时,输入的选项
通过argv存储的内容我们就可以根据不同选项执行不同的内容。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>int main(int argc, char* argv[])    
{              bool flagA = false, flagB = false, flagC = false;    for(int i = 0 ; i < argc; i++)    {          if (strcmp(argv[i], "-a") == 0)    flagA = true;//说明输入了-a选项    else if (strcmp(argv[i], "-b") == 0)    flagB = true;//说明输入了-b选项    else if (strcmp(argv[i], "-c") == 0)    flagC = true;//说明输入了-c选项    }          printf("正在执行 test.exe\n");    if(flagA)    printf("功能a执行中...\n");    if(flagB)    printf("功能b执行中...\n");    if(flagC)    printf("功能c执行中...\n");    return 0;                                                                                               
}   

我们使用的绝大多数指令都是有很多选项的,我们通过输入不同的选项,让程序执行不同的功能,而程序就是通过识别argv,来判断用户输入了哪些选项,进而执行特定的功能的。

在我们向bash输入一大段指令的时候,指令本质就是一个字符串,bash会把字符串拆解为一个个小小的字符串,然后把他们整合到一个叫做命令行参数表的东西中,命令行参数表其实就是一个指针数组,而argv参数可以接收bash维护的数组,在程序内部使用。


env

main函数的第三个参数叫做env,其实它也是一个char*类型的指针数组,类型为char**

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

这个参数和指令env的内容完全一致的。存储了所有环境变量,并且以NULL结尾。

#include <stdio.h>    int main(int argc, char* argv[], char* env[])
{for(int i = 0; env[i] != NULL; i++){printf("env[%d]: %s\n", i, env[i]);}return 0;
}

bash环境变量

其实环境变量是可以继承的,可以通过下面的代码证明。

#include <stdio.h>                                                                                        
#include <unistd.h>
#include <sys/types.h>int main(int argc, char* argv[], char* env[])    
{    pid_t id = fork();    if(id == 0)//子进程    {    for(int i = 0; i < 3; i++)    {    printf("child:  env[%d]: %s\n", i, env[i]);                                                           }    }    else//父进程    {    for(int i = 0; i < 3; i++)    {    printf("father: env[%d]: %s\n", i, env[i]);    }    }    return 0;    
}  

通过fork创建了一个子进程,然后父子进程分别输出env这个数组中的前三个字符串。

输出结果:
在这里插入图片描述

可以看到父子进程都可以正常使用env,说明子进程是可以继承父进程的环境变量表的。而在所有命令行调用的进程中,都是bash的子进程,因此我们的在命令行调用的进程可以继承bash的环境变量表。只有我们登录了系统的时候,bash才会被创建,之前我们就知道,bash要维护一张环境变量表,那么bash的环境变量是怎么来的?其实这些环境变量是存储的在磁盘上的,而我们启动bash的时候,会把这些环境变量从磁盘上拷贝到内存中,组成一张环境变量表,我们访问环境变量实际上是在访问内存中的环境变量,我们修改环境变量实际上也是在修改内存中的环境变量,不会影响磁盘中的环境变量。

因此当我们重新启动Xhell时,bash都会重新从磁盘中拷贝一次环境变量,这样我们之前所做的修改或者自己添加的环境变量都会被覆盖重置

另:在家目录中,有一个叫做.bash_profile的隐藏文件 ,其内部存储的就是环境变量。这个就是我们每次重新启动从磁盘拷贝环境变量的文件内容。

相关文章:

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…...

机器学习-线性回归(最大似然估计)

机器学习任务可以分为两类: 一类是样本的特征向量 &#x1d499; 和标签 &#x1d466; 之间存在未知的函数关系&#x1d466; h(&#x1d499;)&#xff0c;另一类是条件概率&#x1d45d;(&#x1d466;|&#x1d499;)服从某个未知分布。最小二乘法是属于第一类&#xff0c…...

【信息系统项目管理师-案例真题】2017上半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】8 分【问题2】4 分【问题3】8 分【问题4】5 分试题二【问题1】10 分【问题2】8 分【问题3】6 分【问题4】5 分试题三【问题1】5 分【问题2】7 分【问题3】6 分【问题4】3 分试题一 阅读下列说明…...

CSP晋级组比赛生成文件夹与文件通用代码Python

快速生成文件夹与文件的脚本 import sys import osmyfiles sys.argv[1::] for f in myfiles:os.mkdir(f)os.system(f"touch {f}/{f}.in")os.system(f"touch {f}/{f}.out")os.system(f"touch {f}/{f}.cpp")with open("template.cpp",…...

正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A

在正则表达式中&#xff0c;零宽断言是一种非常强大的工具&#xff0c;能够在不消费字符的情况下对匹配位置进行约束。除了环视&#xff08;lookahead 和 lookbehind&#xff09;以外&#xff0c;还有一些常用的零宽断言&#xff0c;它们用于处理边界、字符串的开头和结尾等特殊…...

Android 中实现 PDF 预览三种方式

目录 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09; 步骤&#xff1a;2. 使用第三方库 MuPDF步骤&#xff1a;3. 使用第三方库 PdfiumAndroid步骤&#xff1a; 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09…...

尚硅谷课程【笔记】——大数据之Zookeeper【二】

课程视频&#xff1a;【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1&#xff09;解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…...

CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发

CodeGPT IDEA DeepSeek&#xff0c;在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本&#xff0c;实测2022版IDEA无法获取到CodeGPT最新版插件。&#xff08;在IDEA自带插件市场中搜不到&#xff0c;可以去官网搜索最新版本&#xff09; ToolsVersionIntelliJ IDEA202…...

postgresql 游标(cursor)的使用

概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标&#xff0c;因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量&#xff0c;这是函数返回大数据集的有效方式&#xff0c;函数调用者…...

计算机组成原理——指令系统(六)

在时间的长河中&#xff0c;我们都是追梦人&#xff0c;脚下的每一步都在刻画未来的模样。无论世界如何变幻&#xff0c;心中的那团火焰都不应熄灭。它是你突破黑暗、迎接黎明的力量源泉。每一个不曾起舞的日子&#xff0c;都是对生命的辜负&#xff1b;每一次跌倒后的站起&…...

Python设计模式 - 原型模式

定义 原型模式是一种创建型设计模式&#xff0c;它可以通过复制现有对象来创建新对象&#xff0c;而不是直接实例化新的对象。 结构 抽象原型&#xff08;Prototype&#xff09;&#xff1a;声明 clone() 方法&#xff0c;以便派生类实现克隆自身的能力。具体原型&#xff08…...

金和OA C6 DownLoadBgImage任意文件读取漏洞

金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统&#xff0c;主要应用于企业资源规划&#xff08;ERP&#xff09;、客户关系管理&#xff08;CRM&#xff09;以及办公自动化&#xff08;OA&#xff09…...

【stm32学习】STM32F103实操primary(FlyMCU)

github插入图片实在是太难用了&#xff0c;暂时懒得学就先用CSDN吧hh 一、在设备管理器下&#xff0c;找到单片机&#xff0c;并检查与FlyMCU-搜索端口 显示的是否一致 二、在搜索串口右面的栏里选中该Port&#xff0c;波特率选中115200 三、选择文件夹中的.hex文件&#xff0…...

如何将Excel的表格存为图片?

emmm&#xff0c;不知道题主具体的应用场景是什么&#xff0c;就分享几个我一般会用到的场景下奖excel表格保存为图片的技巧吧&#xff01; 先来个总结&#xff1a; 方法 适用场景 画质 操作难度 截图&#xff08;WinShiftS&#xff09; 快速保存表格&#xff0c;方便粘贴…...

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…...

AUTOSAR面试题集锦(1)

最基础概念 什么是AUTOSAR?AUTOSAR到底做了什么? AUTOSAR,即汽车开放系统架构,是一套专门用于汽车的开放性的框架和行业标准,旨在标准化汽车开发的流程。 AUTOSAR 通过标准化软件接口、交换格式和方法论等内容,主要实现以下几个目标: 1. 使软件和硬件彼此独立,让应…...

【Uniapp-Vue3】从uniCloud中获取数据

需要先获取数据库对象&#xff1a; let db uniCloud.database(); 获取数据库中数据的方法&#xff1a; db.collection("数据表名称").get(); 所以就可以得到下面的这个模板&#xff1a; let 函数名 async () > { let res await db.collection("数据表名称…...

AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析

AIOS: 一个大模型驱动的Multi-Agent操作系统设计与Code分析 随着人工智能技术的快速发展&#xff0c;传统操作系统逐渐暴露出难以适应AI时代多样化需求的局限性。特别是在支持多个智能体协同工作方面存在显著不足。为此&#xff0c;我们提出了一种名为AIOS&#xff08;Artifici…...

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)

一、网络 早期的计算机程序都是在本机上运行的&#xff0c;数据存储和处理都在同一台机器上完成。随着技术的发展&#xff0c;人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用&#xff0c;其运行环 境仅限于个人计算机内部。这种设置虽然…...

收集的面试资料

转载自&#xff1a;NLP_基于酒店评论的情感分析-CSDN博客 机器学习的一般过程 如何介绍项目&#xff1a; 项目背景&#xff1a;项目输入&#xff0c;输出&#xff0c;后续应用点 项目数据&#xff1a;数据来源 数据处理方法&#xff1a;是否有脏数据&#xff0c;如何处理脏数据…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...