Linux--环境变量

目录

命令行参数

认识环境变量

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


命令行参数

在介绍环境变量之前,我们先来理解一下命令行参数,因为命令行参数与环境变量的构成是非常相似的。在这里我们以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。

运行结果:


相关推荐
qq_3129201121 分钟前
Nginx限流与防爬虫与安全配置方案
运维·爬虫·nginx·安全
GanGuaGua27 分钟前
Linux系统:线程的互斥和安全
linux·运维·服务器·c语言·c++·安全
lsnm36 分钟前
【LINUX网络】IP——网络层
linux·服务器·网络·c++·网络协议·tcp/ip
全糖去冰吃不了苦37 分钟前
ELK 集群部署实战
运维·jenkins
不掰手腕1 小时前
在UnionTech OS Server 20 (统信UOS服务器版) 上离线安装PostgreSQL (pgsql) 数据库
linux·数据库·postgresql
Lynnxiaowen1 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
努力学习的小廉1 小时前
深入了解linux系统—— POSIX信号量
linux·运维·服务器
刘一说2 小时前
CentOS部署ELK Stack完整指南
linux·elk·centos
从零开始的ops生活2 小时前
【Day 50 】Linux-nginx反向代理与负载均衡
linux·nginx
IT成长日记2 小时前
【Linux基础】Linux系统配置IP详解:从入门到精通
linux·运维·tcp/ip·ip地址配置