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

LINUX系统编程之——环境变量

目录

环境变量

1、基本概念

2、查看环境变量的方法

三、查看PATH环境变量的內容

1)不带路径也能运行的自己的程序

a、将自己的程序直接添加到PATH指定的路径下

b、将程序所在的路径添加到PATH环境中

四、环境变量与本地变量

1、本地变量创建

2、环境变量创建 

3、其他环境变量 

五、C、C++中main()函数中的参数

1、agrc和argv

1)简易计算器的实现

2、主函数main的第三个参数

六、获取环境变量的方法

1、通过main函数的第三个参数

2、通过environ变量获取

3、通过调用接口getenv( )

​编辑 

4、获取环境变量的作用 

七、环境变量具有全局性 


环境变量

1、基本概念

环境变量这个词相信我们已经听过好多次了,但是到底什么是环境变量呢?试想我们在Linux命令行中输入指令的时候,如我们在不同的目录或者文件夹下输入ls、pwd、cd等等命令的时候,我们并没有带路径的名称,但是系统仍然给出了我们正确的反馈,那么系统是怎么知道我们这个时候是在哪个路径下呢?而我们在执行自己的程序的时候往往需要带上路径才能执行官,否则就会报错。这一切都与环境变量中的PATH变量有关。

所以来说,环境变量就是在操作系统中用来指定操作系统运行环境的一些参数。

  • 对于操作系统中可以直接在命令行使用、不需要指定路径的这些指令(程序), 因为他们的路径已经被添加到了操作系统的环境变量中 。
  • 当在操作系统的命令行不指定路径输入指令的时候, 操作系统会自动地在PATH环境变量 设置的路径中搜索是否存在与指令相匹配的程序。如果可以找到那就执行, 如果找不到, 那就会提示 command not found

2、查看环境变量的方法

  •  env:查看系统中所有环境变量

可以看到服务器上的环境变量还是不少的,但是我们只对PATH环境变量做介绍。

  • 我们可以用env|grep PATH很快找到PATH环境变量

三、查看PATH环境变量的內容

我们可以使用echo $NAME 的方法查看,NAME是环境变量的名称。

Tips:echo命令的主要作用是用于在终端输出文本,且echo最后是一个子进程。

可以看到, PATH中设置的路径有很多:/usr/local/bin /usr/bin /home/July/bin /usr/local/sbin …… 并且, 每个路径之间用 : 分隔,然后我们 就以 /usr/bin 路径为例:

当你进入这个路径, 并执行 ls指令的时候, 你会发现这个路径下有非常多的可执行程序:(只截取一小部分)

在这个路径下的这些命令就是那些像ls、pwd、cd似的不需要添加路径便能自己执行的命令。

1)不带路径也能运行的自己的程序

上面我们知道了凡是在PATH的路径下的命令在运行的时候都不需要添加路径,那么我们能否将自己写的程序添加进这个路径下呢?此时自己的程序再执行的时候是不是也和这些命令一样不需要加路径了呢?

a、将自己的程序直接添加到PATH指定的路径下

但是这种方法有一定的风险,可能会出现自己的程序名和系统自己的某个路径下的程序重名的情况。

Tips:测试完之后可以使用sudo rm -f /usr/bin/程序名的指令删除掉添加的命令。 

b、将程序所在的路径添加到PATH环境中
  • 首先,查看可执行程序当前所处的路径,pwd
  • PATH=$PATH:新路径 
  • 运行程序

但是这里还要强调几点: 

  • export也可以设置环境变量,但是不能用export PATH=新路径,因为”=“是赋值的意思,这样操作就用会新的路径覆盖掉原来的默认的PATH的路径,这样会导致你的程序可以运行,但是原来在默认路径下的其他命令却执行不了。
  • PATH=$PATH:新路径 这里 $PATH可以直接表示PATH原来的內容 ”“是分隔符。
  • 给PATH环境添加新路径,其实就是把新路径下的程序、软件安装到了操作系统中,让操作系统可以找到它。

四、环境变量与本地变量

在操作系统中变量也会分为本地变量和环境变量

1、本地变量创建

  • 直接在命令行上定义的变量,类似C语言的定义变量
  • 既然称为本地变量,当然不能在环境变量中找到
  • 使用echo可以查看本地变量
  • 使用set也可以查看本地变量

2、环境变量创建 

export 环境变量名=环境变量值意思是导出一个环境变量为lrkVar1,环境变量值为201903

unset 环境变量:可以将创建的环境变量删除

3、其他环境变量 

下面介绍一下其他的环境变量

五、C、C++中main()函数中的参数

 我们平时在使用C或者C++编程的时候,主函数main()都不带参数,但是这并不意味着它没有参数,相反它有着参数,且是三个参数,接下来就来介绍一下

int main(int argc,char *argv[],char* env[])
{\\....return 0;
}

1、agrc和argv

  • 我们先看第二个参数argv,他是一个数组,存储的是一个个字符指针,每个字符指针指向相对应的字符串,那它究竟要存多少字符指针呢?这就跟第一个参数相关了。
  • argc是一个整型,存储的是第二个参数的数组中的元素个数。

那么第二个参数中数组的內容是什么呢?既然是数组,我们不妨遍历即可。

当我们运行可执行程序后,如下 

  • 当我们不带任何选项运行./mymian后,可以看到数组的第0个元素事实上就是可执行程序本身。
  • 当我们带上多个选型进行运行后,可以看到这些选项也是该数组中的元素了。 
  • 也就是说, 我们给main()函数添加的 argc 和 argv参数, 其中 argc表示argv数组中元素的个数, 而argv数组中的元素 是由命令行参数提供的, 传入的元素是程序名以及选项。
  • 这样做的好处:程序可以获取到我们们用户输入的选项,从而实现一些的选项所对应的功能。类似我们在shell命令行中输入的带选项的命令,如 ls -al 、rm -f一样。

1)简易计算器的实现

学习了上面main函数中的argc和argv,我们就可以自己实现类似的命令行选项功能。

下面实现一个简易的计算器

-a -s -p -d分别代表的是加减乘除,用户输入的参数必须是四个,分别是可执行的程序、运算符号、数字1和数字2。因为argv中的数字是以字符串形式保存的,所以在拿出来时必须进行转换(atoi),接着进行判断和比较就可以了。 

下面是测试

可以看到,这个小程序可以像shell一样进行命令行类型的输出了。 

2、主函数main的第三个参数

我们可以看到main()函数的第三个参数也是一个数组,存储的就是字符串指针,那每个指针指向的內容又是什么呢?看它的名字是env,那就是和环境变量有关?我们用循环将它打印出来看看

argc,表示传递给程序的命令行参数的数量,包括程序的名称本身,因此其值至少为1,即使它没有指定额外参数。 

六、获取环境变量的方法

1、通过main函数的第三个参数

如上面演示的,通过main函数的第三个参数,我们可以直接在程序中遍历env数组的内容,然后将其内容依次打印显示在显示屏上,查看到系统中所有的环境变量之后,可通过echo $环境变量进行查看获取。

2、通过environ变量获取

3、通过调用接口getenv( )

将变量名字符串填入getenv的参数就可以获取到对应环境变量的内容

4、获取环境变量的作用 

作用之一就是可以限制程序功能的使用对象

七、环境变量具有全局性 

我们在进程那一节说过,当我们每次启动操作系统时,系统都会创建一个bash进程,其可以派生出很多的子进程,如果我们需要在命令行中运行自己的程序时,这个bash进程总是会自己创建一个子进程,让子进程代替他自己去执行该程序。这就是为什么我们每次启动系统后(中途不关机),无论怎么运行、运行多少次自己的程序,该进程的父进程的PID,也就是该进程的PPID永远不变的原因,因为它的父进程一直都是bash进程。

这些子进程都可以读取环境变量,所以环境变量可以被子进程继承下去,也就是说 子进程的环境变量来源于父进程,就我们从命令行运行的进程来说,这些环境变量的来源都是shell,而shell进程的环境变量也来源于它的父进程,这样一直向上推,可以推到1号进程。

环境变量是可以被子进程继承下去的,而普通变量是无法被子进程继承下去的 ,这就是env等命令无法查找本地变量的原因。

其实, Linux系统中的绝大部分命令都是以SHELL进程的子进程的形式运行的, 但是就是存在那一小部分命令并不通过子进程的方式执行, 而是SHELL自己执行.

SHELL也是会调用自己的相应的函数来完成部分功能的, 我们把这种不通过子进程的形式执行的命令, 称为自建命令。

相关文章:

LINUX系统编程之——环境变量

目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1)不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…...

健康老龄化:适合老年人的播客

什么是播客 什么是播客?好问题。对于那些还不熟悉这个术语的人来说,播客有点像在线广播或电视节目。这是一个可下载、可流式传输的程序,定期发布剧集,时长从几分钟到一个多小时不等。您可以在计算机、智能手机或平板电脑上…...

家庭智慧工程师:如何通过科技提升家居生活质量

在今天的数字化时代,家居生活已经不再只是简单的“住”的地方。随着物联网(IoT)、人工智能(AI)以及自动化技术的快速发展,越来越多的家庭开始拥抱智慧家居技术,将他们的家变得更加智能化、便捷和…...

Milvus概念

非结构化数据、嵌入和 Milvus 非结构化数据(如文本、图像、音频)格式多样,蕴含丰富的语义信息,使其分析变得复杂。为了管理这种复杂性,嵌入技术被用来将非结构化数据转换为数值向量,这些向量能够捕捉数据的…...

为什么调用 setState 而不是直接改变 state

在React中,调用setState方法而不是直接改变state的原因涉及多个方面,包括性能优化、状态管理的可预测性、React的设计理念等。以下是对这些原因的详细解释: 1. 性能优化 异步更新与批量处理:setState是异步执行的,Rea…...

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...

cocos creator 3.8 物理碰撞器Collider+刚体RigidBody 8

遇到一个朋友,你来就行的朋友,我过去了,管吃管住,这样的朋友真的很难求。 最近离职了,很难想象,一份策划书一天能给你改n次,一周能郁闷,上一个功能没搞完,让你搞下一个功…...

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代,网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天,我就来和大家分享一段有趣的代码,它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示(文末附完整代码): 目…...

算法模板1:排序+二分+高精度+前缀+差分

文章目录 1.1 排序STL sort函数快速排序算法模板归并排序算法模板 1.2 二分整数二分算法模板浮点数二分算法模板 1.3 高精度高精度加法高精度减法高精度乘低精度高精度除以低精度 1.4 前缀和与差分**一维前缀和****二维前缀和****一维差分****二维差分** 之前整理了好多算法模板…...

SpringBoot实现单文件上传

一、在springBoot项目中的pom.xml添加依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 二、在资源目录下的static目录下中创建一个upload.html的表单文件…...

rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题

我们在使用rust-oracle crate连接oracle进行测试的过程中&#xff0c;会发现无法连接oracle&#xff0c;测试运行过程中抛出“DPI-1047: Cannot locate a 64-bit Oracle Client library”错误。该问题是由于rust-oracle需要用到oracle的动态连接库&#xff0c;我们通过安装orac…...

YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪

在计算机视觉的众多应用场景中&#xff0c;对特定区域的目标进行检测、跟踪与计数是一个常见且重要的需求。无论是在智慧交通中统计通过特定路口的车辆数量&#xff0c;还是在零售分析中追踪进入特定区域的顾客行为&#xff0c;这一功能都发挥着不可或缺的作用。 随着深度学习…...

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…...

InfiniBand(IB)快速上手

什么是IB&#xff1a; InfiniBand&#xff08;直译为“无限带宽”技术&#xff0c;缩写为IB&#xff09;是一个用于高性能计算的计算机网络通信标准&#xff0c;它具有极高的吞吐量和极低的延迟&#xff0c;用于计算机与计算机之间的数据互连。InfiniBand也用作服务器与存储系…...

D74【 python 接口自动化学习】- python 基础之HTTP

day74 http基础定义 学习日期&#xff1a;20241120 学习目标&#xff1a;http定义及实战 -- http基础介绍 学习笔记&#xff1a; HTTP定义 HTTP 是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于 TCP/IP 通信协议来传递数据&…...

移动光猫[HS8545M5-10]获取超密

移动光猫[HS8545M5-10]获取超级密码 1、缘由2、前期准备2.1、确保本地开通telnet客户端功能2.2、准备好相关软件 3、开始查找超密 1、缘由 最近想折腾一下ipv6ddns打通内外网&#xff0c;查询资料说是需要将光猫桥接到外网&#xff1b;但是使用光猫后边的用户名密码根本就找不到…...

原生JS和CSS,HTML实现开屏弹窗

开屏弹窗常应用于打开游戏&#xff0c;或者打开网站的时候&#xff0c;跳出来在正中间&#xff0c;来显示一些信息&#xff0c;并可以设置今日不再显示 CSS代码如下 <style>#box {width: 100vw;height: 100vh;background-color: rgba(0, 0, 0, 0.2);position: relative…...

vue--制作购物车

&#x1f914;如何制作出下列效果呢&#xff1f;&#x1f447; &#x1f636;‍&#x1f32b;️首先: 设置css样式&#xff1a; <style>body {font-family: Arial, sans-serif;}.cart-item {width: 50%;margin-bottom: 15px;padding: 10px;border: 2px solid gray;borde…...

深度测评腾讯云 HAI 智算服务:高性能 AI 计算的新标杆

本文 一、引言二、产品功能深度解析2.1 多样化的 GPU 配置选择2.2 预配置开发环境示例&#xff1a; 2.3 实时性能监控 三、核心技术特点与优势3.1 云端弹性扩展3.2 高性能计算架构 四、实际测试与代码案例4.1 NLP 案例&#xff1a;使用 BERT 进行情感分类数据集&#xff1a;IMD…...

MQ重复消费与消息顺序

如何避免消息重复消费 RocketMQ&#xff1a;给每个消息分配了一个MessageID。这个MessageID就可以作为消费者判断幂等的依据。这种方式不太建议&#xff0c;原因是在高并发场景下这个MessageID不保证全局唯一性。 最好由业务方创建一个与业务相关的全局唯一的ID来区分消息&am…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...