Linux-环境变量(下)

简介: Linux-环境变量(下)

Ⅱ user环境变量


user环境变量,用于查询当前使用用户。我们可以通过getenv函数来查看这个环境变量。


1669273089552.jpg

1669273096476.jpg


这里我们看到,我们在不同用户下user环境变量是不同的。也就是说user可以识别当前用户。


1669273102427.jpg


这里我们也就知道了当我们打开一些文件为什么会提示我们权限不够,就是它配置user环境变量对当前用户身份识别。


其实,sudo的本质就是把user这个环境变量由普通用户改为root。


Ⅲ PWD环境变量


PWD环境变量是查看当前路径的环境变量。


1669273112018.jpg


这个命令非常简单,我们可以自己写一个添加到环境变量。

1669273119186.jpg


当然,别忘了删除哦!


二、shell变量(本地变量)和环境变量


首先我们先介绍一些与本地和环境变量相关的命令,然后具体实操它们之间的联系和区别。


🖊echo  $变量名:显示某个环境/本地变量值


🖊export:设置一个新的环境变量


🖊env:显示所有环境变量


🖊unset:清除环境/本地变量


🖊set:显示本地定义的shell变量和环境变量


本地变量和环境变量有什么区别呢?我们来看以下的操作:


本地变量就是命令行定义的shell变量:


1669273126912.jpg


那么我们env查看环境变量:


1669273134127.jpg

1669273140620.jpg

在这里我们只查看到shell定义的变量没有export是不会被添加到环境变量的。当我们添加后,我们在程序中能用getenv函数查看吗?


1669273146675.jpg


我们发现,我们添加后的环境变量是可以在程序中调用查看的。


如果我们没有把shell变量添加到环境变量在程序中调用函数是查看不到的。


那么说了这么多,shell本地变量 和环境变量表面上区别就是能不能被程序调用,有啥用呢?


我们知道bash是一个系统进程,这里我们创建的可执行程序myecho、addenv是bash的子进程。也就是说环境变量具有全局属性能被子进程继承下去!!环境变量是设置给bash的,子进程会继承这些变量。而shell本地变量--没有添加到环境变量,没有export,只会在当前进程(bash)内有效,不能被继承!


既然env不能查看环境变量,那么用什么指令来查看shell本地变量呢?


set指令!


1669273154402.jpg


set命令可以查看本地变量,那么我想取消一个shell本地/环境变量,使用unset指令。

1669273166359.jpg


三、命令行参数


Ⅰargc&&argv


不知道有的老铁是否知道main函数也是有参数的呢?


int main(int argc,char* argv[])
{}

这里的argc和argv参数是什么含义呢?通过类型我们知道argc是一个整数,而argv表示指针数组,我们可以把它打印出来看一下:


1669273258306.jpg


我们看到当我在命令行内容不断变多时,打印的内容也在随之增加。我们可以类比ls指令。


1669273268222.jpg


我们这里的命令行参数本质就是把程序名和选项依次传给argv指针数组,而argc表示程序名和选项加起来有几个,argc值就是多少,argv数组就有多大。具体系统在这里是如何操作呢?我们举个例子:

1669273278237.jpg

长字符串以空格位间隔拆成一个一个子字符串。argv指针数组存这些字符串,默认情况下指针数组第一个argv[0]就是输入的第一个字符串"ls"


1669273289354.jpg


所以命令行参数的意义就在于命令行选项控制:


1669273297523.jpg


同一个命令打印出来的东西不一样,是通过它的选项控制的!


这里还要提一嘴gcc编译器编译问题,有的老铁可能写for循环编译不过去:


1669273310955.jpg


这是因为gcc编译器版本过低,需要添加c99标准:

1669273319866.jpg


Ⅱenv参数


完整的main函数参数应该有三个:


int main(int argc,char* argv[],char* env[])
{}

1669273333977.jpg


这第三个参数就是环境变量。


1669273341805.jpg


后面就是我们的环境变量以字符串打印出来的内容,我们可以自己添加一个环境变量执行验证一下。

1669273360269.jpg


四、三种查看环境变量的方法


其实这里我们正常写程序不需要写main函数的参数,那么我们想查看所有环境变量如何查看呢?


之前我们已经提到getenv函数可以查看某个已经存在的环境变量,系统还提供了一个函数environ,我们通过man手册查看一下:


1669273374168.jpg


我们可以看到,它是一个二级指针,对它解引用得到

1669273382330.jpg

其实对他解引用就能得到env的每一个成员,也就是环境变量。


我们可以具体写一个程序来查看一下:

1669273393943.jpg


至此,这里可以总结一下程序中获取环境变量的三种方式:


🖊1、getenv()函数


🖊2、main参数 char*env[]


🖊3、extern char** environ--environ函数


其实是由四种方式,还有一种是evho $环境变量 ,这不过这是在命令行查看环境变量,这里所说的三种方式是通过程序查看环境变量的方式。


推荐使用getenv()函数,可以根据环境变量名字直接拿到内容,而其余两种方式是把所有环境变量列举出来查看,有很多不需要关注的内容,没必要列举。


这里遗留一个问题:echo是一个子进程吗?如果老铁觉得是,那么为什么它可以打印本地变量呢?


1669273407060.jpg


因为我们知道本地变量不能被子进程继承,而这里的ddt是一个本地变量啊。why??


echo不是子进程!!这里可以简单解释一下:


echo命令在父shell中执行,echo通过管道将内容输出到子进程中,管道可以用于父子进程之间通信,因此子进程可以拿到父进程输出的内容,这里涉及到进程间通信的内容,且听下回分解❤。

相关文章
|
2月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
20天前
|
Linux Shell
在Linux中,如何设置环境变量?
在Linux中,如何设置环境变量?
|
22天前
|
Shell Linux
在Linux中,什么是环境变量?如何设置和查看环境变量?
在Linux中,什么是环境变量?如何设置和查看环境变量?
|
2月前
|
Java Linux
linux 对子用户配置java 环境变量
linux 对子用户配置java 环境变量
23 3
|
2月前
|
Linux
Linux环境变量及作用
Linux中的环境变量是系统配置参数,如HOME指示用户家目录,MAIL指邮件位置。`env`命令显示所有环境变量。系统有数百个变量,但了解关键的几个足够,如PATH、HOME、TERM等。环境变量由变量名和值组成,可自定义,如WORKDIR。局部变量需用`export`使其全局有效,以便其他用户使用。`su`命令用于切换用户,展示不同用户环境下变量值的差异。
38 0
Linux环境变量及作用
|
2月前
|
Ubuntu Linux Shell
Ubuntu/linux系统环境变量配置详解
理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
119 2
|
3月前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
|
2月前
|
Java Linux Shell
【Linux】深度解剖环境变量
【Linux】深度解剖环境变量
16 0
|
3月前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
26 3
|
2月前
|
Shell Linux
Linux环境变量之shell中export定义全局变量和echo 变量的区别
Linux环境变量之shell中export定义全局变量和echo 变量的区别