Linux的环境变量
一、什么是环境变量
在运行命令时,我们会发现,运行自己写的命令时,需要写出命令的路径,而系统的命令则不需要。而在写命令路径时,也会使用到相对路径,而当前工作目录也不需要我们手动去设置。这些都涉及到Linux的环境变量。
通过printenv指令就可以获得当前Linux操作系统的环境变量,这里就一些常见的环境变量进行介绍:
- USER 用户名,当使用whoami时,输出的就是这个字段的内容
- HOME 当前用户的家目录,当使用cd ~指令时,就会跳转到HOME所指向的目录
- PWD 当前工作目录,当使用pwd指令时,输出的就是这个字段的内容
- PATH 系统查找命令的路径,如果运行指令但是没有命令的路径,操作系统就会在PATH字段中所保存的路径中查找要运行的指令。因此,如果能把自己写的指令所在路径放入PATH,就可以在运行时不写路径
- SHELL 当前使用的shell程序
- LANG 当前系统的语言和字符集设置
那么什么是环境变量呢?环境变量就是操作系统或运行中的程序用来存储配置信息和系统参数的一种键值对,本质上是一个字符串数组,char**。需要注意的是,当fork子进程时,子进程只会继承父进程的环境变量,而并不能反过来影响父进程的环境变量。
二、如何设置环境变量
当我们直接在命令行输入test=123456,再使用printenv后,并不能在其中找到test这个字段,但是,当我们使用echo $test以后,就会输出123456,这说明test=123456确实被记录下来了,我们称其为局部变量,仅仅在创建其的进程中使用。
而要将内容放进环境变量中,需要使用export命令,export test=123456,这样再printenv就可以在环境变量中找到test=123456。
还需要注意的是,export环境变量时采取的是覆盖的方式,也就是说如果你输入export PATH=/home/test,此时,PATH字段的内容就只有/home/test,那么操作系统就无法直接执行一些系统指令。如果要添加路径,最好使用PATH = &PATH:/home/test。其中$PATH就是PATH的内容。如果要删除,则比较麻烦,大概思路就是查找删除覆盖,这里就不具体实现了。另外,如果是要删除一个环境变量整体,则需要unset指令,例如: unset test。
另外,只使用export并不能永久性的改变系统的环境变量,所以如果前面改变了PATH路径,并不用太过惊慌,重启以后就好了。如果要持久性的改变,就需要修改~/.bashrc文件,export想要添加的环境变量,这里只能针对用户自己,如果要对所有用户生效,则需要一定的权限,不建议这样操作。
三、补充
main可以接收来自命令行的参数,例如:int main(int argc, char *argv[], char *envp[]),就能接收命令行例如:ls -a -l,那么argc就等于3,argv[0]="ls",argv[1]="-a",argv[2]="-l"。而envp就是用来接收父进程的环境变量。
而接收环境变量还有两个方法,分别是:
- 使用全局变量 extern char **environ;
- 使用标准库函数getenv()
下面的两种方法使用起来更方便,如果是要传递给子进程专门的环境变量,最好还是使用exec系列的函数调用。