环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。
在链接C/C++程序的代码时,会用到动静态库,但是动静态库我们并没有显示的去指定过让系统去那个路径下寻找它,但是每次都可以链接成功,这是因为有了环境变量的帮助。
环境变量还会有一些特殊的用途,比如可以用作身份验证。
按照生命周期来分,Linux环境变量可以分为两类:
按照作用域来分,Linux环境变量可以分为:
Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。
echo的作用是用于字符串的输出.
运行shell时,会同时存在三种变量:
1) 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量在shell中是这样被定义的name = “tanghuan”
,定义变量时,变量名不加美元符号$.
变量的命名规则如下:
那后面的字符串的双引号是必须的吗?答案是否定的。
字符串可以用单引号,也可以用双引号,也可以不用引号。
${NAME} $后面带上一个花括号可以帮助确定变量范围,是良好的编码习惯。
echo $NAME
//NAME是环境变量的名称
输入:echo $PATH
,
会输出这样一串字符:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
他们以 : 作为分隔符,将其分隔成一些子路径,当写入命令时,会自动一个子路径一个子路径的寻找命令自己的源文件,所以就不需要像我们自己写的文件那样,需要主动加上路径(./project
),才能被系统所识别运行。
环境变量也是变量,跟shell变量的操作一样,不过PATH=(需要添加的环境变量)
这么写可就错了,这样会覆盖掉原来的环境变量,所以得:PATH=$PATH:(需要添加的环境变量)
.
需要注意的是,上面那样添加的环境变量在子进程及其后代进程不会产生影响,且只对本次登录有效,具有临时性。要是想对子进程及其后代进程也有效,需要引入export
,
需要这样写:export PATH=$PATH:(需要添加的进程)
要是不小心像前者那么写并运行了也不用担心,更改的环境变量只限于本次登录,重新登录后。环境变量又会自动恢复成原来的默认路径了。
原因是前面提到的环境变量的分类可以分为永久性和临时性,在当前终端下声明环境变量,是临时性的。要是想永久性的修改环境变量,需要对配置文件进行操作。
cd ~
vim ./bash_profile
export PATH=$PATH:(需要添加的进程)
删除永久性的环境变量需要进入到配置文件中删除相应的命令。
删除临时性的环境变量需要使用到unset (环境变量名称)
命令,如unset PATH
此时会清除所有的命令,若是只想清除部分路径,可以使用添加环境变量的方法进行修改
比如:PATH=(需要保留的路径):(需要删除的路径)
可以:PATH=$(需要保留的路径)
.
命令行的第三个参数就是环境变量数组char* env[]
#include
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
#include
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}
#include
int main()
{
char* p = getenv("PATH");
printf("%s\n",p);
return 0;
}
环境变量通常具有全局属性,可以被子进程继承下去。
因为创建子进程时,是以父进程为模板或者父进程创建的,进程的环境变量信息可以通过子进程及其后代进程继承。
#include
#include
int main()
{
printf("初始PATH的值:%s\n", getenv("PATH"));
putenv("PATH=/usr/local/sbin");
printf("修改后PATH的值:%s\n", getenv("PATH"));
int flag = fork();
if(flag == 0)
{
//子进程
printf("子进程的PATH:%s\n", getenv("PATH"));
}
return 0;
}
创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看