文章目录
环境变量
1.什么是环境变量
- 定义:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
简单来说就是 系统运行环境配置的变量
2.环境变量的作用
- 设置参数:环境变量相当于给系统或用户应用程序设置了一些参数,具体作用看用户或系统定义它的初心是干啥的,例如要求运行一个程序时没有告诉它程序所在路径时,系统除了在当前目录中寻找该程序,还会在环境变量PATH中寻找
3.在命令行配置环境变量
重要的五个命令:env echo export set unset
查看环境变量—env
显示出当前系统中已定义的所有环境变量,其中每个环境变量以**键值对(NAME=VALUE)**的形式展示出来
[gongruiyang@localhost ~]$ env
这些变量中比较重要的是PATH环境变量,这个环境变量中存着程序运行默认搜索路径,后面会详细解释。
打印某个变量内容—echo
echo是用来显示、打印的命令
echo 字符串 —> 原样打印字符串
echo $字符串 —> $后面字符串是一个变量名称,将变量值打印出来
[gongruiyang@localhost ~]$ echo PATH
PATH
[gongruiyang@localhost ~]$ MyValue=2020 <---自定义变量
[gongruiyang@localhost ~]$ echo $MyValue <---查看自定义变量
2020
[gongruiyang@localhost ~]$ echo $PATH <---查看环境变量
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/gongruiyang/.local/bin:/home/gongruiyang/bin:/home/gongruiyang/ClassLinunx
查看变量内容—set
查看所有变量内容,既可以查看环境变量,也可以查看自定义变量
扫描二维码关注公众号,回复: 12138780 查看本文章
[gongruiyang@localhost ~]$ MyValue=2020 <---自定义变量
[gongruiyang@localhost ~]$ echo $MyValue <---查看变量
2020
[gongruiyang@localhost ~]$ env | grep MyValue <---在环境变量中寻找MyValue变量,没有找到
[gongruiyang@localhost ~]$ set | grep MyValue <---在所有变量中寻找MyValue变量,找到了并打印
MyValue=2020
声明定义转换变量—export
将自定义变量转换成环境变量
[gongruiyang@localhost ~]$ export MyValue <---将自定义变量MyValue转换为环境变量
[gongruiyang@localhost ~]$ env | grep MyValue <---在环境变量中寻找MyValue变量,找到了并打印
MyValue=2020
[gongruiyang@localhost ~]$ export MV=1999 <---声明并定义并添加环境变量MV
[gongruiyang@localhost ~]$ env | grep MV
MV=1999
删除变量—unset
unset命令既可以删除自定义变量,也可以删除环境变量
[gongruiyang@localhost ~]$ BBBB=100
[gongruiyang@localhost ~]$ set | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ env | grep BBBB
[gongruiyang@localhost ~]$ export BBBB
[gongruiyang@localhost ~]$ set | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ env | grep BBBB
BBBB=100
[gongruiyang@localhost ~]$ unset BBBB <---将变量BBBB删除
[gongruiyang@localhost ~]$ set | grep BBBB
[gongruiyang@localhost ~]$ env | grep BBBB
4.在代码中配置环境变量
获取环境变量
方法一:getenv函数
char *getenv(const char *name);
name : 环境变量名称
返回值 :环境变量内容的首地址
用命令行查看TESTVALUE环境变量:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
//通过环境变量名称获取环境变量值
char *temp = getenv("TESTVALUE");
if(temp == NULL)
printf("No env var : TESTVALUE\n");
else
printf("TESTVALUE:[%s]\n",temp);
return 0;
}
运行结果如下:
方法二:main的第三个参数
解释:只要运行main函数,环境变量都会被传进来,平时我们用不到环境变量,所以没去接收罢了
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[],char *env[])
{
int i;
for(i=0;env[i]!=NULL;i++)
printf("env[%d]:[%s]\n",i,env[i]);
return 0;
}
输出结果:将环境变量以键值对的方式输出
[gongruiyang@localhost ClassLinunx]$ vim env.c
[gongruiyang@localhost ClassLinunx]$ make
gcc env.c -o env
[gongruiyang@localhost ClassLinunx]$ ./env
env[0]:[XDG_SESSION_ID=3]
env[1]:[HOSTNAME=localhost.localdomain]
env[2]:[SELINUX_ROLE_REQUESTED=]
env[3]:[TERM=xterm]
env[4]:[SHELL=/bin/bash]
env[5]:[HISTSIZE=1000]
env[6]:[SSH_CLIENT=192.168.233.1 58862 22]
env[7]:[SELINUX_USE_CURRENT_RANGE=]
env[8]:[OLDPWD=/home/gongruiyang]
env[9]:[SSH_TTY=/dev/pts/0]
env[10]:[USER=gongruiyang]
env[11]:[LD_LIBRARY_PATH=:/home/gongruiyang/.VimForCpp/vim/bundle/YCM.so/el7.x86_64]
..................................................
方法三:声明库中environ变量
注意哦!environ这个变量在库中是存在的,你只需要使用extern声明引入该变量就可以啦!
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
extern char** environ;
for(int i = 0; env[i]!=NULL;i++)
printf("environ[%d]:[%s]\n",i,environ[i]);
return 0;
}
输出结果:
[gongruiyang@localhost ClassLinunx]$ ./env
environ[0]:[XDG_SESSION_ID=3]
environ[1]:[HOSTNAME=localhost.localdomain]
environ[2]:[SELINUX_ROLE_REQUESTED=]
environ[3]:[TERM=xterm]
environ[4]:[SHELL=/bin/bash]
environ[5]:[HISTSIZE=1000]
environ[6]:[SSH_CLIENT=192.168.233.1 58862 22]
environ[7]:[SELINUX_USE_CURRENT_RANGE=]
environ[8]:[OLDPWD=/home/gongruiyang]
environ[9]:[SSH_TTY=/dev/pts/0]
environ[10]:[USER=gongruiyang]
environ[11]:[LD_LIBRARY_PATH=:/home/gongruiyang/.VimForCpp/vim/bundle/YCM.so/el7.x86_64]
.........................................
设置环境变量
方法一:setenv函数
作用:①添加一个不存在的环境变量 ②修改一个已存在的环境变量值
int setenv( const char *name , const char *value , int overwrite )
- 参数列表:
- name : 环境变量的名字
- value : 环境变量的值
- overwrite : 0 表示如果环境变量已存在不覆盖原值 ; 非0 表示如果环境变量已存在覆盖原值
- 返回值 : 0 表示成功 ;-1表示错误
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
//获取当前系统中环境变量TESTVALUE的值
printf("Befor:[%s]\n",getenv("TESTVALUE"));
//设置TESTVALUE的值为2020
int ret_Modify_setenv = setenv("TESTVALUE","2020",1);
if(!ret_Modify_setenv)
printf("Modify success!After:[%s]\n",getenv("TESTVALUE"));
else
printf("Modify error!\n");
//添加一个新的环境变量
int ret_Add_setenv = setenv("NEWADDVALUE","2020",1);
if(!ret_Add_setenv)
printf("Add success!NEWADDVALUE:[%s]\n",getenv("NEWADDVALUE"));
else
printf("Add error!\n");
return 0;
}
[gongruiyang@localhost ClassLinunx]$ vim env.c
[gongruiyang@localhost ClassLinunx]$ make
gcc env.c -o env
[gongruiyang@localhost ClassLinunx]$ ./env
Befor:[1000]
Modify success!After:[2020]
Add success!NEWADDVALUE:[2020]
方法二:putenv函数
作用:添加或修改环境变量
int putenv( char *string );
- 参数列表:string -> 由name=value组成
- 返回值:0 表示 成功;非零表示
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
char* string = "MyV=1999";
int ret_putenv = putenv(string);
//判断是否成功
if(!ret_putenv)
printf("put success!string:[%s]\n",getenv("MyV"));
else
printf("put error!\n");
return 0;
}
程序运行结果:
[gongruiyang@localhost ClassLinunx]$ ./env
put success!string:[1999]
删除环境变量
unsetenv函数
作用:
int unsetenv( const char *name );
- 参数列表:name -> 环境变量名称
- 返回值 :0 表示 删除成功;-1 表示 删除失败
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int agrc,char *argv[])
{
const char* name = "NEWADDVALUE";
//获取NEWADDVALUE环境变量的值
printf("%s=%s\n",name,getenv(name));
//删除NEWADDVALUE环境变量
int ret_unsetenv = unsetenv(name);
//判断是否删除成功
if(ret_unsetenv == 0)
printf("delete success!%s=%s\n",name,getenv(name));
else
printf("delete error!\n");
return 0;
}
输出结果:
[gongruiyang@localhost ClassLinunx]$ ./env
NEWADDVALUE=2020
delete success!NEWADDVALUE=(null)
5.环境变量在内存中的存储位置
6.关于执行文件路径的变量:$PATH
- 引例
想一想:为什么我们可以在Linux命令行模式中的任何目录中执行 ls 命令?
ls命令的完整文件名为:/bin/ls <—这是绝对路径
之所以我们在Linux命令行模式中的任何目录中执行 ls 都会显示出文件信息,而不会说找不到该 /bin/ls 命令,这是因为环境变量PATH的帮助所致
- 原理
以 ls 命令为例,当我们输入 ls 并按下回车时,系统知道你要执行一个名叫 ls 的可执行文件,这时,系统会在PATH中定义的目录下查找文件名为 ls 的可执行文件,如果在PATH中定义的目录中含有多个文件名为 ls 的可执行文件,那么找到的第一个文件名为 ls 的文件先执行
- 查看有哪些文件路径已被定义在PATH中
使用命令: echo $PATH
上图中打印出来的是gongruiyang身份下环境变量中定义了哪些目录,每个目录用冒号(:)分开
所以可以看出gongruiyang身份下环境变量中已定义的文件目录有:
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/home/gongruiyang/.local/bin
/home/gongruiyang/bin
我们来看看root身份下的环境变量中有些啥
我的Linux系统中root身份和gongruiyang身份中环境变量是一样的(你的可能不一样,这很正常,环境变量中的内容是可以增减修改的,后面会详说~)
<: 这里可以更清楚的知道为啥我们在Linux命令行模式中的任何目录下都能执行 ls 了,因为无论是在root身份下还是在gongruiyang身份下的环境变量中都定义了 user/bin 目录,所以系统会到该目录下搜索 ls 命令,搜索到了就执行啦
总结:环境变量是由一堆目录组成的,这些目录之间由冒号隔开,每个目录之间有先后之分
- 拓展
想一想:如何让我们写的可执行程序文件,无论在哪个目录中都可以被运行呢?
我们写了一个输出一句话的程序
#include <stdio.h>
int main()
{
printf("This is AKA giao, peace & love.\n");
return 0;
}
使用命令将其编译成可执行文件Mytest
gcc test.c -o test
我们在/home/gongruiyang/ClassLinunx目录下可以执行test可执行文件
[gongruiyang@localhost ClassLinunx]$ ls
myTest test.c
[gongruiyang@localhost ClassLinunx]$ pwd
/home/gongruiyang/ClassLinunx <----当前路径
[gongruiyang@localhost ClassLinunx]$ myTest
This is AKA giao, peace & love. <----程序输出
但是我们换一个目录,再执行就会出现下面的结果,并不能找到myTest这个可执行文件
[gongruiyang@localhost ClassLinunx]$ cd ..
[gongruiyang@localhost ~]$ myTest
bash: myTest: 没有那个文件或目录
为了解决无论从那个目录都能运行test可执行程序,我们需要把它所在的目录放进环境变量PATH中去
- 环境变量PATH的增加
目标:将/home/gongruiyang/ClassLinunx目录放入环境变量PATH中,让我们的test程序无论在哪都能执行
使用 环境变量PATH增加 命令:
PATH="${PATH}:待添加目录"
会有以下现象:
这时,我们已经将包含myTest可执行文件的目录放到环境变量中,默认搜索路径就包括了ClassLinux这个文件夹,我们尝试在其他目录下运行myTest这个可执行文件就不会出现找不到文件的情况啦
[gongruiyang@localhost TestDIR]$ pwd
/home/gongruiyang/TestDIR
[gongruiyang@localhost TestDIR]$ myTest
This is AKA giao, peace & love.