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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT:QListView实现table自定义代理

介绍 QListVIew有两种切换形式,QListView::IconMode和QListView::ListMode,通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构,也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理&…

IDEA2023 创建SpringBoot项目(一)

一、Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 二、快速开发 1.打开IDEA选择 File->New->Project 2、…

初级数据结构——树

目录 前言一、树的基本概念二、二叉树三、树的表示方法四、树的遍历树的代码模版五、经典例题[2236. 判断根结点是否等于子结点之和](https://leetcode.cn/problems/root-equals-sum-of-children/description/)代码题解 六、总结结语 前言 从这一期开始数据结构开始有那么一点…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台,执行 Addressable Build 运行,加载 bundle 内的预制体 显示正常 2.Unit…

视频去重工具

视频去重工具 工具截图 下载 回复:“0028”,即可自动获取

javascrip页面交互

元素的三大系列 offset系列 offset初相识 offset系列属性 作用 element.offsetParent 返回作为该元素带有定位的父级元素,如果父级没有定位,则返回body element.offsetTop 返回元素相对于有定位父元素上方的偏移量 element.offsetLeft 返回元素…

win10中使用ffmpeg和MediaMTX 推流rtsp视频

在win10上测试下ffmpeg推流rtsp视频,需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX ,其他客户端从流媒体服务器拉流。 步骤如下: 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub​​​​​…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

STM32-- keil常见报错与解决办法

调试问题 1. keil在线调试需要点击好几次运行才可以运行&#xff0c;要是直接下载程序直接就不运行。 解决&#xff1a;target里面的use microlib要勾选&#xff0c;因为使用了printf。 keil在线调试STM32&#xff0c;点三次运行才能跑到main的问题解决。 keil在线调试STM32…

RNN简单理解;为什么出现Transformer:传统RNN的问题;Attention(注意力机制)和Self-Attention(自注意力机制)区别;

目录 RNN简单理解 RNN n to n Transformer N to M LSTM 为什么出现Transformer:传统RNN的问题 信息丢失的后果 Rnn是顺序执行的效率不高:顺序执行 Attention(注意力机制)和Self-Attention(自注意力机制)区别 一、计算对象不同 二、应用场景不同 三、功能差异…

51c深度学习~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12491632 #patchmix 近期中南大学的几位研究者做了一项对比学习方面的工作——「Inter-Instance Similarity Modeling for Contrastive Learning」&#xff0c;主要用于解决现有对比学习方法在训练过程中忽略样本间相似关系…

Kafka:分布式消息系统的核心原理与安装部署

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

刷算法题时遇到的一些不常用但好用的API

1.需要统计数据&#xff0c;同时希望数据是排序的&#xff0c;可以使用TreeMap结构。 2.按照ASCII&#xff0c;A的ASCII值比a小。而字典排序底层也有基于ASCII&#xff0c;因此无论是字典排序还是ASCII排序&#xff0c;A都在a前面。 3.使用DecimalFormat尝试将浮点数四舍五入…

2024-11-19 kron积

若A[a11 a12; a21 a22]; B[b11 b12; b21 b22]; 则C[a11*b11 a12*b11 a21*b11 a22*b11; a11*b12 a12*b12 a21*b12 a22*b12; a11*b21 a12*b21 a21*b21 a22*b21; a11*b22 a12*b22 a21*b22 a22*b22] 用MATLAB实现 方法1&#xff1a; A [a11 a12; a21 a22]; B [b11 b12; b21 b22]…

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

(7) 探索Python函数的无限可能:从递归到Lambda的奇妙之旅

欢迎进入Python编程的奇幻世界!在这个课程中,我们将一起探索编程的乐趣,通过生动有趣的方式,培养编程的逻辑思维和创造力,该课程适合有一定基础的中学及以上学生及成年人。 以下是我们课程的大纲: 【Python:趣味编程,探索未来】 目录 1. 前言2. 认识我们的“魔法咒语”…

【深度学习|目标跟踪】DeepSort 详解

DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾 查看这篇博客 2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量&#xff0c…

MetaGPT实现多动作Agent

异步编程学习链接 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 教程地址 多动作的agent的本质是react&#xff0c;这包括了think&#xff08;考虑接下来该采取啥动作&#xff09;act&#xff08;采取行动&#xff09; 在MetaGPT的examples/write_…

重学SpringBoot3-Spring Retry实践

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring Retry实践 1. 简介2. 环境准备3. 使用方式3.1 注解方式基础使用自定义重试策略失败恢复机制重试和失败恢复效果注意事项 3.2 编程式使用3.3 监听…

E. Counting Arrays

题意&#xff1a;给定一个长度为n&#xff0c;要求乘积为m&#xff0c;其中组成m的数要求是整数 思路&#xff1a;首先有个很显然的想法&#xff1a;设表示前i个点乘积为j的最小值。因为询问数很多&#xff0c;所以必须离线把所有的东西都处理出来。 转移&#xff1a;&#x…