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[])
{}
可见,argc
是int
类型的变量,而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环境变量 写在前面 对于环境变量,本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”,我们会更详细讲解;理解环境变量的全局…...

机器学习-线性回归(最大似然估计)
机器学习任务可以分为两类: 一类是样本的特征向量 𝒙 和标签 𝑦 之间存在未知的函数关系𝑦 h(𝒙),另一类是条件概率𝑝(𝑦|𝒙)服从某个未知分布。最小二乘法是属于第一类,…...

【信息系统项目管理师-案例真题】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
在正则表达式中,零宽断言是一种非常强大的工具,能够在不消费字符的情况下对匹配位置进行约束。除了环视(lookahead 和 lookbehind)以外,还有一些常用的零宽断言,它们用于处理边界、字符串的开头和结尾等特殊…...

Android 中实现 PDF 预览三种方式
目录 1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上) 步骤:2. 使用第三方库 MuPDF步骤:3. 使用第三方库 PdfiumAndroid步骤: 1. 使用第三方库 PdfRenderer(适用于 Android 5.0 及以上)…...

尚硅谷课程【笔记】——大数据之Zookeeper【二】
课程视频:【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1)解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…...

CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发
CodeGPT IDEA DeepSeek,在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本,实测2022版IDEA无法获取到CodeGPT最新版插件。(在IDEA自带插件市场中搜不到,可以去官网搜索最新版本) ToolsVersionIntelliJ IDEA202…...

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

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

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

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

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

如何将Excel的表格存为图片?
emmm,不知道题主具体的应用场景是什么,就分享几个我一般会用到的场景下奖excel表格保存为图片的技巧吧! 先来个总结: 方法 适用场景 画质 操作难度 截图(WinShiftS) 快速保存表格,方便粘贴…...

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤
一、Keil uVision5创建工程步骤 1.点击项目,新建 2.新建目录 3.选择目标机器,直接搜索at89c52选择,然后点击OK 4.是否添加起吊文件,一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键,添加…...

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

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

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

Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)
一、网络 早期的计算机程序都是在本机上运行的,数据存储和处理都在同一台机器上完成。随着技术的发展,人 们开始有了让计算机之间相互通信的需求。例如安装在个人计算机上的计算器或记事本应用,其运行环 境仅限于个人计算机内部。这种设置虽然…...

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

pytest-xdist 进行多进程并发测试!
在软件开发过程中,测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加,测试用例的执行效率变得尤为重要。为了加速测试过程,特别是对于一些可以并行执行的测试用 例,pytest-xdist 提供了一种强大的工具&…...

LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)
lvgl有触摸、键盘、实体按键、编码器四种输入设备 先来分析一下这四种输入设备有什么区别 (1)LV_INDEV_TYPE_POINTER 主要用于触摸屏 用到哪个输入设备保留哪个其他的也是,保留触摸屏输入的任务注册,其它几种种输入任务的注册&…...

全流程安装DeepSeek开源模型
目录 配置要求安装Ollama选择大模型安装大模型对话备注 配置要求 我的电脑配置为: CPU:i7 12代 GPU:3080 内存:32g 磁盘:1T以上配置运行情况: 运行ollama run deepseek-r1:7b模型无压力,CPU/…...

人工智能领域-CNN 卷积神经网络 性能调优
在自动驾驶领域,对卷积神经网络(CNN)进行性能调优至关重要,以下从数据处理、模型架构、训练过程、超参数调整和模型部署优化等多个方面为你详细介绍调优方法,并给出相应的代码示例。 1. 数据处理 数据增强࿱…...

人工智能A*算法与CNN结合- CNN 增加卷积层的数量,并对卷积核大小进行调整
以下是一个增强版的将 A* 算法与卷积神经网络(CNN)结合的代码实现,其中 CNN 增加了卷积层的数量,并对卷积核大小进行了调整。整体思路依然是先利用 A* 算法生成训练数据,再用这些数据训练 CNN 模型,最后使用…...

机器学习中常用的评价指标
一、分类任务常用指标 1. 准确率(Accuracy) 定义:正确预测样本数占总样本数的比例。优点:直观易懂,适用于类别平衡的数据。缺点:对类别不平衡数据敏感(如欺诈检测中99%的负样本)。…...

Windows安装cwgo,一直安装的是linux平台的
Windows安装cwgo,一直安装的是linux平台的 查看 go env ,发现 GOOSlinux 临时修改 GOOS ,set GOOSwindows ,再安装。 此时,安装的就是 windows 的可执行文件。安装之后再将 GOOS 修改回来即可。...

GitHub Pages + Jekyll 博客搭建指南(静态网站)
目录 🚀 静态网站及其生成工具指南🌍 什么是静态网站?📌 静态网站的优势⚖️ 静态网站 VS 动态网站 🚀 常见的静态网站生成器对比🛠️ 使用 GitHub Pages Jekyll 搭建个人博客📌 1. 创建 GitHu…...

21.[前端开发]Day21-HTML5新增内容-CSS函数-BFC-媒体查询
王者荣耀-网页缩小的问题处理 为什么会产生这个问题?怎么去解决 可以给body设置最小宽度 1 HTML5新增元素 HTML5语义化元素 HTML5其他新增元素 2 Video、Audio元素 HTML5新增元素 - video video支持的视频格式 video的兼容性写法 HTML5新增元素 - audio audio…...

C++SLT(五)——list
目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...