赞
踩
env:查看当前用户全部的环境变量
env|grep 环境变量名:筛选包含的环境变量。
export:显示当前系统定义的所有环境变量。
printenv 环境变量名:查看指定环境变量的值。
unset 环境变量名:清除指定环境变量。
可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。
PATH缺省包含Linux系统命令所在目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。
PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后,在用户下次登陆时生效。
如果想立刻生效,则可执行下面的语句:
$source .bash_profile
需要注意的是,最好不要把当前路径”./”放到PATH里,这样可能会受到意想不到的攻击。
完成后,可以通过$ echo $PATH查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于shell搜索的路径之外的程序了。
设置变量的三种方法
1、在/etc/profile文件中添加变量【对所有用户生效(永久的)】
用vim在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。 例如:编辑/etc/profile文件,添加CLASSPATH变量
- # vim /etc/profile
-
- export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
-
- 注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。
2、在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】
用vim在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。 例如:编辑abc用户目录(/home/abc)下的.bash_profile
- $ vim /home/abc/.bash.profile
-
- 添加如下内容:
-
- export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
-
- 注:修改文件后要想马上生效还要运行$ source /home/abc/.bash_profile
- 不然只能在下次重进此用户时生效。
3、直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】
- 在shell的命令行下直接使用[export 变量名=变量值]
-
- 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,
- shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,
- 需要使用的话还需要重新定义。
- #include <stdio.h>
- #include <unistd.h>
-
- int main(int argc, char *argv[])
- {
- //char *argv[]: 什么类型?里面放什么?
- for(int i = 0; i < argc; i++)
- {
- printf("argv[%d]: %s\n", i, argv[i]);
- return 0;
- }
- }
那么上述功能的原理就和整型变量argc数组argv有关,argv数组中存储着输入的指令和选项,那么根据数组中的内容和else if语句就可以实现不同的选项执行不同的功能,比如说下面的代码:
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- int main(int argc,char*argv[])
- {
- if(argc>=3)
- {
- printf("指令使用错误最多支持一个选项\n");
- return 0;
- }
- if(argc==1)
- {
- printf("开始执行功能一\n");
- }
- else
- {
- if(strcmp(argv[1],"-a")==0)
- {
- printf("开始执行功能二\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-b")==0)
- {
- printf("开始执行功能三\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-c")==0)
- {
- printf("开始执行功能四\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-d")==0)
- {
- printf("开始执行功能五\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-ab")==0)
- {
- printf("开始执行功能六\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-ac")==0)
- {
- printf("开始执行功能七\n");
- //对应的功能
- }
- else if(strcmp(argv[1],"-ad")==0)
- {
- printf("开始执行功能八\n");
- //对应的功能
- }
- else
- {
- printf("选项输入有误\n");
- return 0;
- }
- }
- return 0;
- }
我们可以测试一下上面的代码,当一个选项都不带的时候就应该执行功能一:
添加-a选项的话就应该执行功能二
添加-ab选项的话就应该执行功能六
如果添加的选项过多或者选项不存在的话就会告诉使用者选项有误
那么这就是main函数中的前两个参数的使用场景,有了这两个参数我们写的程序就可以根据不同的执行指令来执行不同的功能,指令的设计就是使用这种方式,在函数中对输入指令进行判断,再执行对应指令。无非就是使用C语言对具体功能进行封装。
第三个参数
- int main(int argc, char *argv[], char *env[])
- {
- return 0;
- }
通过代码如何获取环境变量
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(int argc, char *argv[], char *env[])
- {
- int i = 0;
- while (env[i])
- {
- printf("%s\n", env[i]);
- ++i;
- }
- return 0;
- }
编译运行:
通过数组env也可以在程序内部打印出来环境变量的内容,但是main函数为什么要加第三个参数呢?getenv函数同样可以来获取环境变量的内容,如果想要获取某一个环境变量的内容的话应该使用getenv函数,而env数组是给子进程使用的子进程是一个笼统的概念,我们可能会在子进程中使用各种各样的功能,所以环境变量的每个值可能都要得到,所以就会有这个数组方便子进程使用环境变量,我们之前说环境变量具有全局属性在任意的进程中都能使用,它之所以有全局属性的原因是在创建子进程的时候会继承环境变量,那子进程是如何继承环境变量的呢?答案就是通过main函数的第三个参数来实现继承环境变量。我们把env数组看成一个表,表中的每个元素看成一个指针,指针指向的内容就是一个个的环境变量,linux还提供给我们一个二级指针,这个指针就指向的是表中的首元素
每 个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
通过第三方变量environ获取
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(int argc, char *argv[], char *env[])
- {
- extern char **environ;
- int i = 0;
- while (environ[i])
- {
- printf("environ[%d] : %s\n", i, environ[i]);
- ++i;
- }
- return 0;
- }
子进程在继承父进程的环境变量的时候是通过main函数的第三个参数实现的,而第三个参数是一个字符指针数组,数组在传参的时候传的是首元素的地址,所以子进程在继承环境变量的时候,系统得传一个二级指针那么这个指针就是上面使用的char**environ。
先创建一段本地变量:
对本地变量进行查找
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- char* val=getenv("myval");
- if(val==NULL)
- {
- printf("not find myval\n");
- }
- else
- {
- printf("%s\n",val);
- }
- return 0;
- }
可以发现这个程序是找不到本地变量的。
那我们使用export修改一下本地变量myval为全局变量
可执行程序便能找到myval这个全局变量了。
bash是一个系统进程,myproc会通过fork()变成bash的子进程。环境变量具有全局属性,可以被子进程继承。我们可以通过这些全局变量找指令路径,进行身份认证等。而本地变量仅当前进程(bash)有效,它的子进程无效。
因为有一个PWD的环境变量,它维护着用户当前所处的绝对路径,当用户所处的路径变化时,PWD环境变量会自动更新,我们在执行的指令,这些指令本质上是bash的子进程,它们可以拿到这个全局变量,这些指令也就知道了目前所处的绝对路径。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main()
- {
- char* name=getenv("USER");//通过"USER"环境变量可以对不同角色进行权限的限制。
- if(strcmp(name,"root")==0)
- {
- printf("%s\n",name);
- }
- else
- {
- printf("权限不足\n");
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。