Linux操作系统学习---初识环境变量

目录

​编辑

环境变量的概念:

小插曲:main函数的第一、二个参数

获取环境变量信息:

1.main函数的第三个参数

2.查看单个环境变量

3.c语言库函数getenv()

和环境变量相关的操作指令:

1.export---导出环境变量:

2.unset---清除环境变量:

3.env指令

4.set---显示所有环境变量和本地变量:

环境变量的特性:

1.可以被子进程继承的全局性:

2.由bash引入

结尾;


环境变量的概念:

环境变量的基本格式是 "内容"="内容",中间不能用空格分开。粗略一点来说,他是程序执行时所依赖文件的路径。

先思考一个问题:为啥我们在运行代码时非得像下面这样加上 ./ ,而执行系统的指令又不用呢(如下图)?这就和今天的环境变量有关了。

小插曲:main函数的第一、二个参数

main函数实际可以有三个参数,这里先介绍两个,一个是整形;另一个是字符指针数组(形参名称具体是啥不重要哈),第二个参数也叫命令行参数。

下面通过例子来帮助理解:main函数的第一个整形参数代码接收指令的个数,第二个字符指针数组参数存放每个指令字符串的首地址。

可以看到运行 用./code执行这个可执行程序时我象征性的带了四个选项,都被这两个参数记录下来了。由于Linux下的指令大多也是用c语言实现,因此使用的系统指令时可以带各种选项就是通过这个原理来实现的。

当然这里也有蹊跷,我们自己的程序要加上 ./来指定当前路径运行,而系统的指令(如ls、pwd)等等就不用,这就和环境变量有关。

获取环境变量信息:

1.main函数的第三个参数

这里我们补充main函数的第三个参数,它和第二个参数一样也是字符指针数组,不同的是它存放各个环境变量字符串的首地址。

下面的程序打印出的arr数组的内容很多,都是和刚才的env指令显示一样的环境变量。

2.查看单个环境变量

刚才都是一次性显示所有的环境变量,这次咱挑其中一个瞧瞧----它就是环境变量PATH,可以以下方式查看它的内容:

不难看出就是一堆不同的路径,用 : 来分隔。其实我们在执行一个指令时,命令行解释器bash就会默认到这里面去寻找对应的文件并执行其中的内容,系统级的指令(如ls)就在这些路径中的一个里,而我们自己写的程序则没有,就需要使用 ./ 来告诉bash在当前目录下执行。

3.c语言库函数getenv()

c语言<stdlib,h>头文件里有一个getenv函数,原型如下,它接受环境变量名称,返回环境变量内容。

和环境变量相关的操作指令:

1.export---导出环境变量:

格式如下,这样可以自己手动添加环境变量。

2.unset---清除环境变量:

格式如下,这样可以删除环境变量。

3.env指令

运行env后可以看到环境变量的内容还蛮多的,在这里就不展示了,有些一看就知道是啥,有的需要着重了解,可以解开一些之前学习时的疑惑。

4.set---显示所有环境变量和本地变量:

set指令相较于env更近一层,不仅显示显示环境变量,还显示本地变量()。

环境变量的特性:

1.可以被子进程继承的全局性:

由于子进程创建时会和父进程公用一份代码和数据,所以自然而然环境变量也是共同使用的。下面通过在代码中创建子进程来验证

从上面的代码执行结果可以看到父进程先打印了环境变量(有时候子进程先打印),随后进程进行打印,二者打印的内容相同。

2.由bash引入

如果使用上面提到的export向系统里添加自己的环境变量或者删除系统本身的环境变量,接着退出系统后重新进入,就会惊奇的发现环境变量貌似自动初始化了。

上述情况的发生是因为环境变量是存储在操作系统中的,在打开一个新终端时,bash进程创建,从系统的配置文件里读取环境变量,相当于我们正常情况下访问到的环境变量只是一份拷贝,当退出终端后这种文件就会销毁,下一次登陆时又是新的bash进程从配置文件里读取未改变的环境变量。

结尾;

通过上面的认知,咱就可以明白为啥运行自己的可执行时为啥要用 ./ ,而运行系统指令就不需要的原因了。因为存在环境变量PATH,其中就包含了系统指令的当前的执行目录,因此bash可以直接找到系统指令的执行路径(如ls的),但我们的程序路径不存在于PATH中,就需要通过.来自定当前的路劲。

相关推荐
Ian10256 分钟前
《Learn Three.js》学习(3)光源
前端·javascript·学习·webgl·图形学·三维·三维光源
霜雪殇璃7 分钟前
2024.11.28(作业)
学习
c语言中的小小白25 分钟前
【Linux】线程ID与互斥、同步(锁、条件变量)
linux·运维·服务器
weixin_438197381 小时前
apache实现绑定多个虚拟主机访问服务
linux·服务器·网络
Kendra9192 小时前
RHCE NFS
linux
bboywxy83402 小时前
Ubutuns服务器搭建与维护
linux·服务器·ubuntu
何陈陈2 小时前
【Linux】网络基础
linux·网络·智能路由器
2301_792185882 小时前
基于Linux操作系统的DNS服务器实验
linux·运维·服务器
友友马2 小时前
『 Linux 』网络层 - IP协议 (二)
linux·网络·tcp/ip·计算机网络·ip
肾透侧视攻城狮2 小时前
网络空间安全之一个WH的超前沿全栈技术深入学习之路(13-2)白帽必经之路——如何用Metasploit 渗透到她的心才不会让我释怀
学习·安全·web安全·网络安全·系统安全·网络攻击模型·可信计算技术