Linux--环境变量

embedded/2024/9/23 10:39:27/

目录

命令行参数

 认识环境变量

环境变量的特性及命令行操作


命令行参数

在介绍环境变量之前,我们先来理解一下命令行参数,因为命令行参数与环境变量的构成是非常相似的。在这里我们以main函数为例:
下面是一段代码:

运行结果:输入字符串./mytest -a -b -c -d,然后bash将对应的5传给argc,然后将5个参数传给argv

解释:我们输入的一个个串会被bash解析成一个个的小子串,然后维护成指针数组,然后传给main。我们姑且把我们传入的叫做命令行参数表,必须以NULL结尾,我们将它传给了main。

我们为什么要把一个个的参数传给main呢?来看下面的示例:

我们要实现三种不同的功能,-1,-2,-3,看下面代码:

运行结果:我们后面没带选项,就会提示我们带选项;-1,就输出function 1 ......

这段代码是在做什么呢?

我们可以通过不同的选项让同一个程序执行它内部不同的功能。

我们发现,其实我们平时用的指令后面一般都会跟选项,为什么我们的指令可以有不同的选项,我们的选项跟不同的功能,这是因为指令和选项会传给它main函数中,对应的argc,argv来完成不同的功能,所以我们明白了,选项就是对应的命令行参数,传递给main函数去实现不同的功能。在windows系统中也是这样的,例如showdown -s -t 3(在3s后关机)。


 认识环境变量

环境变量,不是一个,而是一堆,彼此间没有关系。

环境变量,是系统内置的具有特殊用途的变量。定义变量的本质,其实是开辟空间,在运行的期间我们的程序也能开辟空间。操作系统/bash是c语言写的程序,它能在运行中开辟空间吗?可以,系统的环境变量,本质就是系统自己开辟空间,给他名字和内容即可!!!

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

常见的环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。 

为什么在运行我们自己程序的时候需要使用./查找到我们的可执行程序,而使用系统的却不用呢?

这是因为在系统中存在一个全局的环境变量,PATH(使用echo $加PATH就可以查看该命令的内容了)

这个命令里面保存的是指导命令所对应的搜索路径,它会在这些路径去搜索需要使用的系统命令。如果我们也想让我们自己的程序执行的时候不需要加命令,我们可以将自己程序拷贝到上面的路径中去。(等于把自己写的程序安装到系统中了)(这里就不做演示了)

使用env可以查看系统中全部的环境变量

当用户登陆操作系统时,系统会开辟一块空间,把用户对应的环境变量维护起来,这样操作系统就认识这个用户了。(进入系统这个环境,而提前准备的变量)


环境变量的特性及命令行操作

 1.echo $(环境变量) 2.env 查看环境变量

3.export(设置环境变量,这种方法仅仅是临时使用)

这就将,AGE=18设置成环境变量了,通过env可以查看。


获取环境变量的第一种方式:

main函数的第三个参数:char*env[ ]

eg:

看看运行的效果:

将我们的整个环境变量的表给打印出来了。

当我们运行这个可执行程序的时候,就变成了进程,该进程的父进程就是Bash,Bash会构建命令行参数表,和命令行参数的个数传给main函数;同理Bash也在自己的代码里有了一张内置的表char*env[ ](环境变量表),这个表指向每一个环境变量。B我们的可执行程序变为进程后,继承了父进程(Bash)传给我们的表),环境变量默认是可以被子进程继承的。

看下面的代码:

运行结果:

说明:(特性)环境变量是具有全局属性的,环境变量会被所有的子进程包括孙子进程进行继承!

环境变量默认是在bash中的。bash进程启动的时候,默认会给我子进程形成两张表:argv[]命令行参数表(用户输入的命令行),env[]环境变量表(来自os的配置文件)。bash通过各种方式交给子进程。

在这里我们就知道了:export的本质实际上就是,在env表中找一个空的位置,把我们写的字符串放进去。值得一提的是:export值内建命令,一般的命令都是bash创建子进程执行的,但内建命令却由bash亲自执行,所以export才能把字符串写进env表中

如果想取消自己定义的环境变量,使用unset指令就好了(unset+自己定义的环境变量名)


获取环境变量的第二种方式:获得一个指定的环境变量

函数getenv,直接获取环境变量的内容。

代码示例:

运行结果:


第三种方式:

 先看一段代码:这里需要借助函数environ。

运行结果:



http://www.ppmy.cn/embedded/6676.html

相关文章

.NET 设计模式—备忘录模式(Memento Pattern)

简介 备忘录模式,又称之为快照模式(Snapshop Pattern),是一种行为型设计模式,,它允许在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们…

头歌平台云计算实验

云计算 Hive综合应用案例——用户学历查询1 查询每一个用户从出生到现在的总天数2 同一个地区相同的教育程度的最高收入3 统计各级学历所占总人数百分比 Hive综合应用案例——用户学历查询 1 查询每一个用户从出生到现在的总天数 ---------- 禁止修改 ----------drop databas…

SpringCloud系列(8)--将服务提供者Provider注册进Eureka Server

前言:上一章节我们介绍了Eureka服务端的安装与配置,本章节则介绍关于微服务如何入职Eureka Server Eureka架构原理图 1、修改provider-payment8001子模块的pom.xml文件,引入Eureka Clinet的依赖,然后reolad一下,下载依…

centos的服务器root密码重置的步骤

如果CentOS服务器的root密码被修改了,你需要进行密码恢复操作。以下是在CentOS系统上恢复或重置root密码的步骤: CentOS 7 或 CentOS 8 重启服务器: 重新启动你的服务器。在启动过程中,当GRUB启动菜单出现时,按下e键来…

Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python数据挖掘项目开发实战_使用朴素贝叶斯进行社会媒体挖掘_编程案例实例课程教程.pdf Pytho…

2024红明谷杯——Misc 加密的流量

2024红明谷杯——Misc 加密的流量 写在前面: 这里是贝塔贝塔,照例来一段闲聊 打比赛但赛前一波三折,又是成功签到的一个比赛 说起来比赛全名叫红明谷卫星应用数据安全场景赛,但好像真的跟卫星的关系不大,没有bin方…

Java高阶私房菜:高并发之线程池底层原理学习

目录 什么是池化思想 什么是线程池 JDK中线程池关键类( ThreadPoolExecutor) 线程池设计原理和核心参数配置 ​编辑线程拒绝策略 Executors创建常见线程池种类 工具类创建线程池 应用场景问题解析 商品详情页聚合接口 商家管理后台业务报表数据…

C++奇迹之旅:构造函数和析构函数

文章目录 📝类的6个默认成员函数🌠 构造函数🌉 概念🌉特性🌉三种默认构造函数 🌠 析构函数🌠 特性🚩总结 📝类的6个默认成员函数 如果一个类中什么成员都没有&#xff0…