一基本概念1环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数2如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。3环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。二常见环境变量在linux我们可以使用env命令查看有多少环境变量如图这就是linux当前的所以环境变量然后每个环境变量代表什么意思呢我们通过下面的表格理解名称作用PATH指定用户的搜索路径HOME指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL当前Shell,它的值通常是/bin/bashUSER获取当前用户LOGNAME获取登录用户HISTSILE记录最近登录的1000条指令LS_COLORS配色方案HOSTNAME当前主机名SSH_CLIENT客户端进程号SSH_TTY当前终端设备LANG编码格式PWD当前工作路径OLDPWD旧工作路径三参看环境变量的方法echo $NAME //NAME:你的环境变量名称如图我们只需要在echo $ 环境变量的名字 就能获得环境变量的内容了如图为什么我们在执行系统的命令的时候我们直接就可以执行但是如果我们执行我们直接生成的二进制文件可执行文件的时候我们就要加上 “./ 二进制文件名”为什么呢这是因为系统的命令已经放在了一个环境变量名字是PATH里面了如图PATH环境变量就是存放了所有系统指令的路径所以我们在执行系统命令的时候系统会默认在PATH环境变量里面寻找如果成功找到了我们就执行这个命令如果没有找到就会报错四和环境变量相关的命令名称作用echo显示某个环境变量export设置一个新的环境变量env显示所有的环境变量unset清除环境变量set显示本地定义的shell变量和环境变量如果我们想把我们自己生成的二进制文件添加到环境变量里面我们以后执行我们自己的二进制文件就可以不需要加上 “./” 这是完全没有问题的所有把我们自己生成的可执行程序就是使用export命令如图为自己写的程序通过编译变成可执行程序然后我们发现我们的main主函数既然带了两个参数因为我们以前写的main函数是默认不带参的其实我们的main函数是可以带参的它默认可以带三个参数的分别是 int argc 和 charargv[ ] 和 charenv[ ] 这三个参数的只是我们平时不用int argc表示后面字符数组argv的个元素数而后面的env是用来存当前的环境变量的。而如果你带了这些参数是表示你要执行的主程序里面的某个子程序#includestdio.h#includestring.hintmain(intargc,char*argv[],char*env[]){if(argc!2){printf(Usage:%s[-a|-b|-c\n,argv[0]);}constchar*argargv[1];if(strcmp(arg,-a)0)printf(这是功能1\n);if(strcmp(arg,-b)0)printf(这是功能2\n);if(strcmp(arg,-c)0)printf(这是功能3\n);elseprintf(Usage:%s[-a|-b|-c]\n,argv[0]);return0}然后我们把这个程序的路径复制在了PATH环4境变量里面经过查看我们这个PATH路径也确实包括了我们生成的可执行程序的路径因为我们这个路径已经在PATH环境变量里面了我们进行执行也确实不需要加上 “./” 就能直接执行了如图我们我们对虚拟机进行关机我们就会发现也不能直接执行我们的可执行文件了我们通过查找环境变量里面的内容就会发现我们上次把我们生成的可执行文件的路径已经不见了这是因为这个export命令只有临时的作用不能一直把自己复制的路径一直存在在那里。然而在我们的日常使用中我们也不允许将自己的可执行的文件路径一直存在PATH环境变量里面因为我们自己的代码没有进行和系统测试你无法知道你的代码会不会和系统的其它一些程序发生冲突所以我们一般不允许将自己的的可执行路径一直存在PATH环境变量里五通过代码获取环境变量程序1#includestdio.hintmain(intargc,char*argv[],char*env[]){inti0;for(;env[i],i){printf(%s\n,env[i]);}return0;}如图我们通过执行程序我们发现这个程序成功的输出了我们当前的环境变量程序2#includestdio.hintmain(intargc,char*argc[]){externchar**environ;inti0;for(;environ[i];i){printf(%s\n,environ[i]);}return0;}如图如果我们执行这个程序我们也是能成功获取环境变量。libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。六通过系统调用获取或设置环境变量#includestdio.h#includestdlib.hintmain(){char*valuegetenv(PATH);if(valueNULL)return1;elseprintf(PATH-%s\n,value);}如图我们通过什么的代码就能成功的通过环境变量的名字获取它相应的内容七环境变量通常是具有全局属性的环境变量通常具有全局属性可以被子进程继承下去#includestdio.h#includestdlib.hintmain(){char*envgetenv(MYENV);if(env){printf(%s\n,env);}return0;}通过程序我们发现我们系统中根本没有这个环境变量所以这个程序什么都不执行但是如果我们使用这个export命令导出这个环境变量发现程序又能运行了这就说明环境变量通常具有全局属性可以被⼦进程继承下去让子进程使用环境变量的个性化操作比如执行一个只有自己可以执行的程序#includestdio.hintmain(){constchar*ubuntugetenv(USER);if(ubuntuNULL)return1;if(strcmp(ubuntu,ubuntu)0)printf(这是程序正常执行逻辑\n);elseprintf(only ubuntu!!\n);return0;}如图这是只有当前用户才能执行的程序只有当前用户才能执行任何用户都不行如图如果我们使用root用户进入那个文件里面进行执行那个可执行程序发现也不能执行只有ubuntu用户才能执行
Linux 环境变量
一基本概念1环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数2如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。3环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。二常见环境变量在linux我们可以使用env命令查看有多少环境变量如图这就是linux当前的所以环境变量然后每个环境变量代表什么意思呢我们通过下面的表格理解名称作用PATH指定用户的搜索路径HOME指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL当前Shell,它的值通常是/bin/bashUSER获取当前用户LOGNAME获取登录用户HISTSILE记录最近登录的1000条指令LS_COLORS配色方案HOSTNAME当前主机名SSH_CLIENT客户端进程号SSH_TTY当前终端设备LANG编码格式PWD当前工作路径OLDPWD旧工作路径三参看环境变量的方法echo $NAME //NAME:你的环境变量名称如图我们只需要在echo $ 环境变量的名字 就能获得环境变量的内容了如图为什么我们在执行系统的命令的时候我们直接就可以执行但是如果我们执行我们直接生成的二进制文件可执行文件的时候我们就要加上 “./ 二进制文件名”为什么呢这是因为系统的命令已经放在了一个环境变量名字是PATH里面了如图PATH环境变量就是存放了所有系统指令的路径所以我们在执行系统命令的时候系统会默认在PATH环境变量里面寻找如果成功找到了我们就执行这个命令如果没有找到就会报错四和环境变量相关的命令名称作用echo显示某个环境变量export设置一个新的环境变量env显示所有的环境变量unset清除环境变量set显示本地定义的shell变量和环境变量如果我们想把我们自己生成的二进制文件添加到环境变量里面我们以后执行我们自己的二进制文件就可以不需要加上 “./” 这是完全没有问题的所有把我们自己生成的可执行程序就是使用export命令如图为自己写的程序通过编译变成可执行程序然后我们发现我们的main主函数既然带了两个参数因为我们以前写的main函数是默认不带参的其实我们的main函数是可以带参的它默认可以带三个参数的分别是 int argc 和 charargv[ ] 和 charenv[ ] 这三个参数的只是我们平时不用int argc表示后面字符数组argv的个元素数而后面的env是用来存当前的环境变量的。而如果你带了这些参数是表示你要执行的主程序里面的某个子程序#includestdio.h#includestring.hintmain(intargc,char*argv[],char*env[]){if(argc!2){printf(Usage:%s[-a|-b|-c\n,argv[0]);}constchar*argargv[1];if(strcmp(arg,-a)0)printf(这是功能1\n);if(strcmp(arg,-b)0)printf(这是功能2\n);if(strcmp(arg,-c)0)printf(这是功能3\n);elseprintf(Usage:%s[-a|-b|-c]\n,argv[0]);return0}然后我们把这个程序的路径复制在了PATH环4境变量里面经过查看我们这个PATH路径也确实包括了我们生成的可执行程序的路径因为我们这个路径已经在PATH环境变量里面了我们进行执行也确实不需要加上 “./” 就能直接执行了如图我们我们对虚拟机进行关机我们就会发现也不能直接执行我们的可执行文件了我们通过查找环境变量里面的内容就会发现我们上次把我们生成的可执行文件的路径已经不见了这是因为这个export命令只有临时的作用不能一直把自己复制的路径一直存在在那里。然而在我们的日常使用中我们也不允许将自己的可执行的文件路径一直存在PATH环境变量里面因为我们自己的代码没有进行和系统测试你无法知道你的代码会不会和系统的其它一些程序发生冲突所以我们一般不允许将自己的的可执行路径一直存在PATH环境变量里五通过代码获取环境变量程序1#includestdio.hintmain(intargc,char*argv[],char*env[]){inti0;for(;env[i],i){printf(%s\n,env[i]);}return0;}如图我们通过执行程序我们发现这个程序成功的输出了我们当前的环境变量程序2#includestdio.hintmain(intargc,char*argc[]){externchar**environ;inti0;for(;environ[i];i){printf(%s\n,environ[i]);}return0;}如图如果我们执行这个程序我们也是能成功获取环境变量。libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。六通过系统调用获取或设置环境变量#includestdio.h#includestdlib.hintmain(){char*valuegetenv(PATH);if(valueNULL)return1;elseprintf(PATH-%s\n,value);}如图我们通过什么的代码就能成功的通过环境变量的名字获取它相应的内容七环境变量通常是具有全局属性的环境变量通常具有全局属性可以被子进程继承下去#includestdio.h#includestdlib.hintmain(){char*envgetenv(MYENV);if(env){printf(%s\n,env);}return0;}通过程序我们发现我们系统中根本没有这个环境变量所以这个程序什么都不执行但是如果我们使用这个export命令导出这个环境变量发现程序又能运行了这就说明环境变量通常具有全局属性可以被⼦进程继承下去让子进程使用环境变量的个性化操作比如执行一个只有自己可以执行的程序#includestdio.hintmain(){constchar*ubuntugetenv(USER);if(ubuntuNULL)return1;if(strcmp(ubuntu,ubuntu)0)printf(这是程序正常执行逻辑\n);elseprintf(only ubuntu!!\n);return0;}如图这是只有当前用户才能执行的程序只有当前用户才能执行任何用户都不行如图如果我们使用root用户进入那个文件里面进行执行那个可执行程序发现也不能执行只有ubuntu用户才能执行