目录
-
1.什么是环境变量
- 环境变量是指在操作系统中用来指定操作系统运行的一些参数;换句话说,操作系统通过环境变量来找到运行时的一些资源。
- 例如:
- 链接的时候,帮助链接器找到动态库 (标准库的) ; (用户自己编译的动态库需要自己指定环境变量)
- 执行命令的时候,帮助用户找到该命令在哪一个位置,
- 例如ls,ldd
-
2.常见的一些环境变量:
-
2.1PATH:
- 指定可执行程序的搜索路径,程序 员执行的命令之所以能找到,这个环境变 量起到的作用(汗马功劳),可以这样理解,我们的ls,ldd都是可执行程序,在我们输入ls命令时,PATH这个环境变量就会帮我们找到这个程序的路径在哪。现在假设一个场景可以帮助我们更好的理解,假如当前在一个文件夹下,当前文件夹中有一个可执行程序fork_z。
- 那么我们在执行它的时候是需要输入./fork_z命令的这里的./就是告诉bash我们的可执行程序在哪个路径底下。
- 我们也可以再次验证,这次我们在一个目录下创建一个可执行程序,然后进入当前目录下的一个子目录。然后在子目录当中输入可执行程序的位置
-
2.2HOME:
- 登录到linux操作系统的用户家目录
-
2.3shell:
- 当前的命 令行解释器,默认是“/bin/bash"
-
-
3.查看当前的环境变量
-
3.1env:
- 我们输入env可以看到输出了所有环境变量和其值
-
- 环境变量名称:环境变量的值(使用:进行间隔)
- 1.系统当中的环境变量是有多个的
- 2.每一个环境变量的组织方式都是key(环境变量名称):value(环境变量的值—可以有多个值,每个值之间都是使用“:”进行间隔)
- 我们找到环境变量PATH
- 可以看到他有许多值,我们将这些值分开来看
- 那么我们在执行可执行程序的时候就会在这些路径下查找看看有没有当前可执行程序,如果有就执行,如果没有就报错。那我们的ls命令可以在任意文件夹下查找那就是因为在这些路径下找到了对应的可执行程序。
- 为了验证上面我们说的话,接下来我们可以查找ls的所在路径,如果找到的路径和PATH中的路径可以匹配,那么即可验证每次输入命令时,都会在PATH的值当中寻找当前可执行程序。
-
3.2echo $ [环境变量名称]
-
3.3在操作系统中查找一个命令
- 用which +[命令名称]
- 而我们发现在环境变量中也有/usr/bin这个路径
-
-
4.环境变量对应的文件
- 系统级文件:针对于各个用户都起作用( root用户修改),强烈不推荐 修改系统级的环境变量文件,因为会影响其他用户
-
4.1/etc/bashrc
- 我们输入vim /etc/bashrc大概就是这样一个界面
- 用户级别环境变量文件:推荐大家修改这两个文件,只对自 己用户的环境变量做出修改,影响自己
-
4.2 ~/ .bash_ profile
- 输入命令
- 可以看到环境变量文件
-
~/ . bashrc
- 输入命令
- 可以看到环境变量文件
-
4.3/etc/bashrc
- 输入命令
- 可以看到环境变量文件
- ~/ .bash_ profile 包含~/ .bashrc包含/etc/bashrc
-
5.修改环境变量
- 起手式export环境变量名称= [$环境变量名称] : [新添加的环境变量的内容]
-
5.1命令行当中直接修改:
- 特点: 临时生效
- 如果是新增,可以不要[$环境变量名称], 即export 环境变量名称= [新添加的环境变量的内容]
- 我们创建好之后我们可以验证一下他是不是临时的,我们新打开一个窗口,查看TEST_ENV可以发现无内容输出。
- 如果是修改老的:必须加上[$环境变量名称],否则之 前的环境变量的值就找不到了。
- 如果我们不加$可以看一下
-
而我们加上$就相当于将老的环境变量拿来[$老的环境变量名] 然后再后面加上:加上新的内容。
- 我们此时看环境变量PATH当中的内容
- 1
-
5.2文件当中修改:
- 特点:修改之后不会立即生效,需要配合source[环境变量文件名称],永久生效
- 新增:在文件末尾直接添加:export 环境变量名称=[新添加的环境变量的内容]
- 然后我们查看环境变量,发现还是没有,这是因为我们只是添加上了但是并没有让它生效。
- 我们还需要输入命令source ~/.bash_profile立即生效,此时发现我们新加环境变量已经生效。
- 修改老的:在老的后面加“:【新添加的环境变量的内容】
- 然后将修改的文件执行source命令就可以生效了
-
5.3如何让自己的程序不加./直接使用程序名就可以执行呢?
- 1.将我们的程序放到/usr/bin下面(不推荐使用,因为这个路径下存放的都是系统生成的可执行程序)
- 2.将可执行程序的路径加到PATH中。
- 我们可以让将自己当前的路径添加到环境变量PATH当中,然后输入可执行程序的名字时就可以直接执行了。
- 不过这只能临时生效。
- 在上边的文件中给PATH加上路径就也可以直接执行。在搜索环境变量中的路径时找到就会直接执行再不会搜索了。
-
6.环境变最的组织方式
- 环境变量是以字符指针数组的方式进行组织的,最后的元素以NULL结尾的(当程序拿到环境变量的时候,督导NULL,就知道读取完毕了)
- char* env[]:本质上是一个数组,数组的元素是char*,每一个char*,都指向一个环境变量(key=value)
-
7.代码获取环境变量:
-
1. main函数的参数
- main(int argc, char* argv[], 。char* env[])
- 我们运行程序可以发现环境变量就被打印出来了
- 扩展的知识:命令行参数,我们可以看到ls是可以接收命令行参数-a,-l的,他是通过自己的main函数来接受参数的。那么当前ls的命令行参数是几个呢,这里有人就要说是两个了,但是不然其实是三个因为这里命令行参数是计算程序本身的,所以ls,-a,-l这是三个参数。
- 那么同理我们自己写的程序也可以接收命令行参数,也通过main函数的第一,第二个参数来接收。接下来我们可以验证一下
- 命令行参数个数:
- 首先我们在代码中将命令行参数个数打印出来:
- 执行代码我们给他输入三个命令行参数可以发现打印显示有四个命令行参数
- 命令行参数内容:
- 接了来我们再将内容打印出来
- 我们发现它将当前程序的命令行参数都输出出来了
- 结论:我们可以知道了程序可以接收命令行参数我们也可以理解,为什么ls这个程序接收到不同的命令行参数,ls这个程序内部会做处理就会执行相应的功能。
-
2. environ
- extern char **environ; 这个是全局的外部变量,在libc. so当中定义,使用的时候, 需 要用extren关键字
- 接下来我们来用environ来获取环境变量
- 我们来执行代码,可以发现他将所有的环境变量都打印出来了
-
3. getenv
- 看一个函数我们先直接man
-
- #include<stdlib.h>
- char *getenv( const char *name) ;
- 参数:环境变量名称
- 返回值:环境变量的值,没找到返回NULL
- 我们来测试一下
- 执行可以发现它将我们的PATH环境变量输出了。
最后都看到这里了如果绝对有用,不如点个赞再走吧!!!
-