📝前言:
这篇文章我们来讲讲Linux环境变量
🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏
环境变量
一,什么是环境变量
环境变量是一种存储配置信息 的机制,这些信息会影响进程的运行环境和行为。比如,我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功。原因就是:有相关环境变量帮助编译器进行查找。
环境变量具有全局性,环境变量会被子进程继承
二,常见的环境变量
(1)查看环境变量
env
:查看所有环境变量echo $名称
:$
:查看对应名称的变量内容【变量 = 名称 + 内容】
示例(env
):
示例(echo $PATH
):
(2)常见的环境变量
从上面的env
命令,我们可以看到很多相关的环境变量。下面点出几个相对重要的。
PATH
: 指定命令的搜索路径USER
:当前登陆系统的用户LOGNAME
:当前登录用户的名称HOME
: 当前用户的主目录路径(即用户登陆到Linux系统中时,默认的⽬录)SHELL
: 当前Shell,它的值通常是/bin/bashPWD
:用户当前所在的文件系统目录路径OLDPWD
:上一个工作目录(cd -
就是用这个)
关于 USER
和LOGNAME
以及HOME
的变化:
su root
:USER
和LOGNAME
不会变,因为没有重新登陆,但是HOME
会变- 我们直接
su -
(用root用户重新登陆 ),三个都会变成root
对应的
(3)环境变量的来源及组织
环境变量的来源
我们在每次登陆Xshell的时候,都会创建一个父进程bash,这个bash是我们和系统交互的重要软件。
在登陆时,bash都要加载系统的相关配置文件 ,在加载配置文件的时候,就会读取文件中的环境变量。通过加载.bash_profile
和.bashrc
文件实现。
.bash_profile
:Bash shell 在用户登录时执行的配置文件。它主要用于进行一次性的、与登录相关的环境初始化工作,例如设置环境变量、定义命令别名、执行启动脚本等。(可以简单理解为这是一个shell脚本,执行多条命令来完成环境初始化操作。shell脚本就是把多条命令写在文件里面,执行文件就可以实现执行多条命令).bashrc
:用于设置与交互式环境相关的配置,例如命令提示符样式、命令补全、历史记录设置等- 登陆时会先执行
.bash_profile
文件,在.bash_profile
文件里面调用.bashrc
环境变量的组织(环境变量表)
- 加载好环境变量以后,bash会用一张环境变量表 (哈希表:名称 = 内容,这个
=
相当于:
)来组织环境变量。

-
这个表储存在 bash 的上下文里。假设有 10 个登陆,则分别创建 10 个bash,每一个 bash 都要加载配置文件,都有环境变量表。
-
environ
是一个全局变量,它指向一个以空指针结尾的字符指针数组,该数组保存了当前进程的所有环境变量。
三,bash如何利用PATH执行命令
为什么执行我们自己的test
可执行文件需要:./test
呢,但是执行ls
却可以直接写。这就和环境变量PATH有关!
(1)命令行参数表
什么是命令行参数?
- 当我们输入
ls -a -l
的时候,我们输入的其实是一个长字符串。bash会以空格为分割,把我们的长字符串拆成ls
、-a
、-l
,这三个就叫做命令行参数。 - bash 会把拆分好的命令行参数,存入一个以空指针结尾的字符指针数组,该数组保存了该条命令的所有命令行参数。(不同的命令行参数,是实现程序不同的子功能)

(2)理解使用PATH过程
- 当我们输入
ls -a -l
指令,bash会根据这条指令生成命令行参数表 - 要执行
ls
,就必须先找到它 - 于是,bash就在环境变量表中找到
PATH
环境变量 - 用
PATH
里面的路径,拼接上ls
这个命令,查找有没有对应路径的可执行。 - 如果找到了就执行,没找到就是
command not found
四,与环境变量有关的其他命令
(1)添加PATH
PATH=/new/path
,会覆盖PATH内容(当前会话有效)export PATH=$PATH:/new/path
:可以往PATH里面添加/new/path
这条路径。(当前会话有效)- 永久添加的方法:把
export
命令添加到.bash_profile
或者.bashrc
文件里
(2)设置环境变量
和PATH
一模一样,因为PATH本身就是环境变量
export MY_VAR=my_value
(当前终端会话有效,使用export
设置的变量才可以被继承)MY_VAR=my_value
:设置本地变量,本地变量,子进程无法继承(所以,其实bash会记录两套变量)- 永久添加:把
export
命令添加到.bash_profile
或者.bashrc
文件里(就是在文末加)【第三点由AI生成】- 修改
~/.bashrc
文件(适用于交互式非登录 shell) - 修改
~/.bash_profile
文件(适用于登录 shell)
- 修改
unset NAME
:删除NAME
环境变量set
: 显示本地定义的shell变量和环境变量
(3)获取环境变量
-
方法一:
echo
-
方法二:通过
environ
environ
就是一个全局变量,environ
没有包含在任何头文件中,使用时要用extern
声明:
cpp
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++)
{
printf("%s\n", environ[i]);
}
return 0;
}
- 方法三(推荐):使用系统调用:
getenv(NAME)
,在<stdlib.h>
头文件- 得到变量
NAME
的内容 - 返回的是首地址(即:这个内容字符串的首地址)
- 得到变量
cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
(4)内建命令
- 内建命令是不需要创建子进程的,由 shell 本身实现的命令(或系统调用)。
- 如:
cd
、pwd
、export
五,main函数的命令行参数
实际上,main 函数并不是程序的第一个函数,main 函数也是被调用的,被 start 调用,main 函数也是可以接受参数的.。
main 函数的参数:
cpp
int main(int argc, char *argv[], char *env[])
argc
:命令行参数的个数argv
:命令行参数表nev
:环境变量表(父进程会自动传)
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!