目录
什么是环境变量?
-
环境变量是一个全局变量,系统中存在大量的环境变量,存在新式是以键值对的方式存在。
-
每一个环境变量都有特殊功能,用于完成特定的系统功能。
-
环境变量可以被系统中运行的任何进程访问。
-
环境变量可以存储:目录路径、文件路径、系统信息、临时标志或状态等等。
PATH环境变量:
-
执行一个命令,需要先找到他的可执行程序在哪,也就是要找到可执行程序的目录。
-
系统命令可以直接调用,不指明目录,是因为他的目录存储在PATH中。
echo $PATH //打印PATH路径
- PATH的本质就是一个由目录组成的字符串列表,各目录之间使用冒号分隔(Linux)。当输入一个命令时,操作系统会按照PATH变量中定义的目录顺序依次搜索对应路径,查询命令对应的可执行程序。找到就执行,找不到就报错。
临时修改环境变量PATH:
-
这种修改适用于其他所有环境变量,且只会持续到当前终端会话结束。
-
这种修改是对内存中当前会话的环境变量进行修改,并不会影响系统配置文件或其他会话中的 PATH 变量。
PATH=$PATH:new path
//将一个目录添加到环境变量
//PATH表示之前的目录字符串列表,如果不加PATH就会直接使用new path覆盖原来的PATH
- 如果想要删除PATH中的某个目录,可以直接将去掉该目录的PATH覆盖原PATH。
HOME环境变量:
-
HOME环境变量存储当前用户主目录的路径。
-
用户登陆时,从/etc/passwd 文件读取用户的主目录路径,赋值给HOME环境变量。
-
用户登陆成功后,调用 "cd $HOME" 命令进入用户的主目录路径。
echo $HOME //查看HOME环境变量
可能使用环境变量的场景:
-
身份认证,限定部分用户可以使用程序的部分功能。
-
首先getenv获取USER环境变量的值,得到操作系统的当前用户的用户名。
-
然后和可使用功能的用户列表做对比,当前用户在列表中,就可以使用功能,否则不行。
进程和环境变量的关系:
-
命令行启动的进程,他们的父进程都是bash / shell。这些进程的环境变量是由bash / shell传递过来的。
-
父进程的环境变量是从用户主目录中的.bash_profile文件中读取到的。当用户登录后,系统会自动从.bash_profile文件读取配置信息,将值填充到bash的环境变量表中。
环境变量相关操作:
echo $环境变量 //显示环境变量的变量值。
export 环境变量 //添加一个自己的环境变量到bash,使用env可以查看。并没有直接写入到配置文件,而是在bash的上下文中存储。如果想要写到配置文件,使用vim打开.bash_profile文件,将这句话添加到配置文件即可。
env //显示所有的环境变量。
unset //清楚环境变量。
set //显示本地定义的shell变量和环境变量。
代码获取环境变量:
char* getenv(const char* name); //通过环境变量名称获取环境变量,使用要包含头文件<stdlib.h>。
printf("PATH: %s",getenv("PATH"));//获取PATH环境变量
主函数传参获取环境变量:
int main(int argc,char* argv[])
{
for(int i=0;argv[i];i++)
{
printf("%d : %s",i,argv[i]);
}
}
通过C语言指针获取环境变量:
-
通过C语言自动设置好的全局变量,可以在main函数不接受参数的情况下访问环境变量表( char* argv[] )。
extern char** environ; //指向argv[]的指针。
for(int i=0;environ[i];i++) //环境变量表的最后一个元素为nullptr
{
printf("environ[%d] : %s",i,environ[i]);
}
本地变量和环境变量的区别:
-
将本地变量使用export声明后,本地变量提升为环境变量。
MY_BIANLIANG=100 //直接在命令行声明,属于本地变量。等于号两边不要带空格。
export MY_BIANLIANG //使用export声明后,提升为环境变量 -
本地变量只会在bash进程有效,不会被子进程继承。
-
环境变量可以被所有子进程继承,来实现他的" 全局性 "。
Linux命令分类:
-
内建命令:由Shell程序(如Bash、Zsh等)直接提供和解释执行;不需要启动新的进程,执行速度通常更快。常见的内建命令有 cd、echo、alias、export、set、history 等。
-
外部命令:独立的可执行程序,当执行外部命令时,Shell会启动一个新的子进程来运行这个命令。常见的外部命令有 ls、grep、find、cp、mv、awk、sed 等。
取消环境变量:
unset MY_BIANLIANG
查看环境变量:
env //查看环境变量
set //查看包含环境变量的所有变量(包括本地变量)