环境变量
再Linux操作系统中一切皆文件,这个环境变量自然也是一个文件,它的作用是辅助我们使用操作系统还可以辨识我们是什么用户(一般用户,root用户)。

env是读取完整环境变量的指令,里面记录了许多我登录操作系统所用的用户的信息,如


这里显示我的用户名字是ljj1,通过ssh的方式链接本地和远程的IP地址和端口号也有。这是当我通过SSH链接这个服务器时自动添加的环境变量。
这个表示我当前登录所使用的终端信息,当然这个也是一个文件只要我们像这个文件写入就可以在我这个设备上显示写入的信息。

我们平时编译程序时需要链接动静态库,但是我们并没有在编译时标明动静态库在哪,就是因为环境变量里也包含了通用的库的地址这是,库是操作系统本身就包含的。

这个就是动态库的地址,当编译器编译程序时会通过此路径找到相应的库进行链接。

这个用户并不是root用户,只是一个普通用户,所以会有一个根目录与root会有所不同
这个就是用户的根目录
小结:环境变量里面还有一些其他的变量信息如会话ID(session),编码信息,颜色编码等。若我们进入一个操作系统,但是没有环境变量的话使用起来会有多么的繁琐,当我们需要查看当前路径下的文件信息需要输入 /usr/bin/ls -la,但是有了环境变量能让我们方便需要甚至不需要直到这个程序在哪里或者动静态库在哪里,查看文件信息只需要 ls -la,编译只需要gcc或者g++加上文件名就可以。
更改添加环境变量
我们知道了当我们执行ls指令时实际上也是执行一个程序,只不过环境变量里面包含了程序所在的路径所以我们可以直接使用,那我们平时编译完一个程序时执行程序需要在命令行里面输入路径加程序名但是有了环境变量我们就不再需要输入路径,只需要程序名就可以了。


如图这里我们只需要添加我们当前目录的路径就可以直接使用了

即使我们并不在当前目录也可以,因为会在这个环境变量的路径上寻找这个程序。
环境变量是设计好也是操作系统非常重要的一些变量,一般情况是不太建议去修改,因为可能修改之后就不知道跟什么文件,程序重合产生一些意想不到的bug,若是需要修改这里建议使用export修改

这里可以理解为给PATH重新赋值,赋上旧PATH的值然后用:分割再加上你需要添加的绝对路径完成添加。注意export修改是临时的只对当前会话有效,若你重新开一个终端或者重新登录就恢复原样了,export是内存级的,是修改的内存中操作系统的环境变量,而环境变量本身的文件是没有修改的,若要永久修改就需要找到 .bashrc文件


需要直接在文件里面进行修改,文件在~目录下,用户会在其自己的目录下有一个环境变量的文件。上面用的是root账号。

当我是用户的时候只需要在我用户账号的根目录下就可以找到这个文件。
程序中的环境变量

我们的主函数是有参数的一共三个第一个是指令数,例如我们在外面使用ls程序会输入ls -l -a这里一共三个指令分别是程序名,-l选项和-a选项这三个就会传递给主程序,这里的argc就是3,第二个参数就是一个字符串指针数组,每个指针都分别指向"ls""-l""-a"这三个字符串。但其实操作系统还有一个参数会传递给程序就是环境变量,这里我们接收了第三个参数然后打印出来的结果就是

操作系统传进来的环境变量了,当我们编译的时候编译器就能通过这个去找到相应的链接库和自己的工作路径了,所以我们在同一个文件夹中进行的链接是不需要指定链接的文件的路径的。这个参数是具有全局性的,子进程都会继承下去。
本地变量
set是查询本地变量的指令

当我们没有加export时就是直接加入一个本地变量,这里我们加入了一个本地变量MYPATH

用set查询到了这个变量

在环境变量中是查询不到的。

这里我们使用了一个程序进行打印变量

但是子进程中并没有这个变量的。
所以我们得出结论本地变量只在当前进程中有效,此进程分出的子进程是不会继承本地变量的。
我们使用操作系统都是需要一个命令行程序,通过输入指令去指示操作系统工作,这个就是我们的外壳程序,也就是bash进程,而我们输入的指令所打开的程序就是这个程序的子程序。