文章目录
- 关于环境变量
- 概念(了解)
- 例引 环境变量
- 查看环境变量的方法
- echo && printenv 命令
- 环境变量的配置
- .bash_profile
- 常见 环境变量
- 通过程序获取环境变量
- 本地变量
- 环境变量表
关于环境变量
概念(了解)
环境变量的概念了解即可,通过后文内容,更便于理解其概念。
-
环境变量是计算机操作系统中的一种重要机制,用于存储并访问系统配置信息、资源路径、程序库路径和其他相关信息。
-
环境变量可以在系统启动时被设置和加载,并且可以通过脚本或命令行工具来修改和查询。
-
环境变量的名称都由大写字母组成,而变量的值可以是任何字符串,包括数字、文本、路径等等。环境变量还可以包含其他环境变量,以及特殊字符和转义字符。
-
-
操作系统会使用环境变量来控制各种系统行为,例如,查找可执行文件的路径、指定默认的字符编码、指定默认的打印机等等。
-
应用程序也会使用环境变量来存储和访问各种配置信息,例如,Java开发工具包(JDK)会使用JAVA_HOME环境变量来指定JDK的安装目录。
例引 环境变量
我们知道,linux中,ls等大多命令本身是可执行程序,而指令后的参数为命令行参数,比如执行 ls -a -l
命令时,ls 为可执行程序,而-a -l 属于命令行参数。
看下面的程序执行:
当直接执行我们自己实现的程序时,会弹出bash: myProc: command not found
的错误,只有使用./myProc
,即加上路径后才能使用。
因为:要执行一个命令,必须找到对应的可执行程序。
当我们执行ls 命令时,其具有默认搜索路径,即PATH
,所以可以直接执行命令。
而这里的PATH
就是环境变量:用于指定可执行文件的搜索路径。
查看环境变量的方法
echo && printenv 命令
echo:
Linux下,我们可以利用echo
命令查看环境变量,下面用 echo $PATH
查看PATH路径
printenv:
printenv
命令用于打印出所有的环境变量及其值
环境变量的配置
如何将我们的路径配置到PATH中?
通过 PATH=$PATH:/home/test
命令将我们自己的路径配置到PATH中
此时我们执行 该路径下的程序 就不必再指明路径了:
如果要删除我们加上的路径
只需要PATH=/路径
,即将之前的路径重新赋给PATH即可。
需要注意的是通过 PATH=$PATH:/home/test
这样的命令来修改 PATH 环境变量,仅仅在当前 shell 进程中将 PATH 变量增加了一个路径(即内存上 的修改),而没有将修改持久化到系统中。
当关闭当前 shell 进程时,修改的 PATH 环境变量也会随之被销毁
即关闭运行软件后,修改就恢复了,这是为什么?
我们知道:命令行启动的进程都是 shell/bash
的子进程,子进程的命令行参数和环境变量,是父进程bash所传递的。
我们使用PATH=$PATH
命令直接修改的是bash内部的环境变量信息,而重启shell进程后,父进程bash依然可以找到对应路径,父进程的环境变量信息从哪里来?
答:
-
每一次重新登录,系统都会形成新的bash解释器 且 新的bash解释器 会从(进程地址空间)中读取形成自己的环境变量表信息。
-
而 环境变量信息是以脚本配置文件的形式存在的 ,则上面括号内即为相应的脚本配置文件。
.bash_profile
而在linux下,在用户的主目录下会有一个隐藏文件 .bash_profile
下面是对上面.bash_profile文件的解释:
-
if [ -f ~/.bashrc ]; then . ~/.bashrc fi
这部分代码检查是否存在 ~/.bashrc 文件,并在存在时加载该文件。这样可以将 .bash_profile 和 .bashrc 文件的配置整合在一起。 -
接下来,
PATH=$PATH:$HOME/bin
设置了一个名为 PATH 的环境变量,将 $PATH(原始的 PATH 值)和 $HOME/bin 目录(用户的个人二进制文件目录)合并在一起。通过这个设置,系统可以在用户执行命令时搜索到 HOME/bin 目录中的可执行文件。 -
最后,
export PATH
将 PATH 环境变量导出,使其在当前 shell 会话以及新的子 shell 中可用。
- 该
.bash_profile
文件会在用户登录时自动执行,所以当我们修改bash 的环境变量时,重启shell进程,环境变量信息又会重置。 - 如果我们想永久修改环境变量,就需要修改
.bash_profile
文件。
常见 环境变量
-
PATH:指定可执行文件的搜索路径
-
HOME:指定当前用户的主目录路径,常用于指定某些应用程序的默认工作目录。
-
USER(或USERNAME):指定当前登录用户的用户名。
-
TEMP(或TMP):指定临时文件的存储路径,某些应用程序会将临时文件存放在该路径下。
-
SHELL:指定当前用户所使用的shell程序的路径。
通过程序获取环境变量
在C++中,我们可以通过getenv() 函数获取环境变量的值。
getenv()
函数的原型如下:
// name参数是要获取的环境变量的名称,返回值是一个指向字符串的指针,表示该环境变量的值。如果环境变量不存在,则返回空指针。
char* getenv(const char* name);
我们用下面的示例代码,演示如何获取环境变量:
#include <iostream>
#include <cstdlib>
int main() {
const char* path = getenv("PATH");
if (path != nullptr) { // 检测是否获取成功
std::cout << "PATH environment variable: " << path << std::endl;
} else {
std::cout << "PATH environment variable does not exist." << std::endl;
}
return 0;
}
当我们执行程序后,发现环境变量PATH被正确输出:
本地变量
linux下,在命令行中用下面的方法声明本地变量:
variable_name=value
如果要使用本地变量,需要在变量名前加上 $
符号。例如,在 Bash Shell
中输入以下命令:
my_var="Hello, World!"
echo $my_var
而命令行下创建的本地变量的作用域是有限的,通常仅在当前 Shell 会话中有效。这意味着在当前 Shell 中定义的本地变量不能被其他 Shell 或子进程访问。
如果要在子 Shell(如子进程或命令替换)中使用本地变量,应该使用 export
命令将其导出为环境变量,例如:
my_var="Hello, World!"
export my_var
这样,在子 Shell 中就可以使用 $my_var 访问该变量的值了。
如果要删除本地变量,则可使用 unset
命令,例如:
unset my_var
环境变量表
-
环境变量表是 操作系统中存储环境变量的数据结构,它是一个键值对的集合,用于存储各种系统级和用户级的配置信息。
-
Linux下,环境变量表是通过名为环境变量列表(Environment Variables List)的数据结构来实现的!该列表是一个字符串数组,每个字符串都包含一个环境变量的定义。
-
环境变量表中的每个元素都是以
key=value
的形式表,可以使用 env 或 printenv 命令来查看当前环境变量表中的所有环境变量。你也可以使用echo $VAR_NAME
命令来检索特定环境变量的值。
下面的图片展示了使用env
命令,打印出环境变量表信息:
下面的例子展示了,本地变量的相关操作