初识环境变量
目录:
1.什么是环境变量
我们在Linux操作系统下,使用指令,比如
ls
,pwd
,cd
等等,可以直接使用,但是我们编译完C/C++文件后产生的test
可执行程序,我们却需要输入./test
才能运行,我们加了一个路径才让程序跑起来,而平时的操作指令却不需要加路径,为什么?
- 这是环境变量中的
PATH
在搞鬼
概念 :环境变量(Environment Variables)是操作系统用于存储配置信息的变量,这些信息可以影响系统和应用程序的行为。
又比如我们在编译C/C++文件时,我们并没有输入动/静态库的位置,但还是编译成功,原因是有相关环境变量帮助编译器进行查找。
2.常见的环境变量
- PATH:指定操作系统查找可执行文件的目录列表。
- HOME:当前用户的主目录路径。
- USER:当前登录用户的用户名。
- SHELL:默认的命令行解释器(shell)路径。
- PWD:当前工作目录路径。
- LANG / LC_ALL:设置系统的默认语言和区域,影响应用程序的本地化显示。
- TEMP / TMP:系统临时文件存储路径,程序可在此创建临时文件。
3.Linux中与环境变量的有关的命令
-
export
-
用途:设置一个新的环境变量或将一个本地变量变为环境变量,使其在当前 shell 会话的子进程中可用。
-
用法 :
export VAR_NAME=value
bashexport PATH="$PATH:/new/path" #在PATH环境变量下新增路径,需要带上旧的PATH,不然PATH将只有新的路径 export MY_VAR="Hello"
本地变量是什么?
bashMY_VAR="Hello" #不加export,此时的MY_VAR就是本地变量 export MY_VAR="Hello" #MY_VAR此时是就是临时的环境变量(仅对当前会话有效)
-
-
echo
-
用途:显示环境变量的值。
-
用法 :
echo $VAR_NAME
bashecho $PATH echo $USER
-
-
env
-
用途:显示当前 shell 会话中的所有环境变量。也可以用于在临时设置环境变量的情况下执行一个命令。
-
用法:
bashenv # 显示所有环境变量 env VAR=value command # 在特定环境变量设置下执行命令
示例:
bashenv PATH=/tmp ./myprogram
-
-
printenv
-
用途:显示指定环境变量的值。如果不指定变量名,则显示所有环境变量。
-
用法:
bashprintenv PATH printenv # 显示所有环境变量
-
-
set
-
用途:显示所有 shell 变量,包括环境变量和本地变量。也可以用来设置本地变量(但不默认导出为环境变量)。
-
用法:
bashset # 显示所有变量 set VAR=value # 设置一个本地变量
-
-
unset
-
用途:删除一个变量(环境变量或本地变量)。
-
用法 :
unset VAR_NAME
bashunset MY_VAR
-
4.如何获取环境变量
-
使用 Shell 命令获取环境变量
-
从配置文件中获取
在 Linux 系统中,环境变量可以通过读取用户或系统配置文件获取,例如:
/etc/environment
:全局环境变量配置文件,影响系统中的所有用户。~/.bashrc
、~/.bash_profile
、~/.profile
:用户特定的配置文件,在用户登录时加载。
-
在编程语言中获取环境变量,这里只讨论C语言
-
通过系统调用 获取-->
getenv
C#include <stdio.h> #include <stdlib.h> int main() { printf("%s\n", getenv("PATH")); return 0; }
-
命令行第三个参数
C#include <stdio.h> int main(int argc, char *argv[], char *envp[]) { int i = 0; for(; env[i]; i++) { printf("%s\n", envp[i]); } return 0; }
对于
main
函数居然有三个参数,我是很震惊的,因为已经学了一年C/C++了,才知道。-
int argc
(Argument Count):- 表示命令行参数的个数,包括程序本身的名称。
argc
的值至少为 1,因为第一个参数是程序的名称。
例如,如果运行
./myprogram arg1 arg2
,则argc
的值为 3。 -
char *argv[]
(Argument Vector):- 一个字符串数组,包含所有命令行参数。
argv[0]
是程序的名称或路径,argv[1]
到argv[argc - 1]
是用户传递的参数。argv
的最后一个元素通常是一个空指针(NULL
),表示参数列表的结束。
在前面的例子中,
argv[0]
为./myprogram
,argv[1]
为arg1
,argv[2]
为arg2
。 -
char *envp[]
(Environment Pointer):- 环境变量的字符串数组(通常不常见于标准 C,但在某些编译器和系统中支持)。
- 每个元素都是一个以等号
=
分隔的字符串,形式为"KEY=VALUE"
。 envp
的最后一个元素通常是一个空指针(NULL
),表示环境变量列表的结束。
通过
envp
,程序可以直接访问调用它时的所有环境变量。需要注意的是,使用envp
的main
函数通常定义为int main(int argc, char *argv[], char *envp[])
。
-
-
通过第三方变量environ获取
C#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; }
environ
是一个特殊的全局变量,它指向环境变量的数组。environ
没有包含在任何头文件中,所以在使用时 要用extern声明。- 在 Linux 和 Unix 系统中,
environ
数组的最后一个元素为NULL
,表示环境变量列表的结束。
-
5.环境变量的特点
-
继承性:父进程可以将其环境变量传递给子进程,子进程会继承父进程的环境变量副本。
本地变量:没有继承性
-
临时性 :在命令行会话中设置的环境变量仅对当前会话有效。永久更改环境变量需要将其添加到系统或用户的环境配置文件中(如
.bashrc
、.profile
或 Windows 系统变量设置)。 -
大小写敏感:在 Linux 和 Unix 系统中,环境变量名称区分大小写,而在 Windows 中则不区分大小写。
6.环境变量的作用
-
配置应用程序:许多应用程序通过读取环境变量获取其配置参数,比如数据库连接信息、API 密钥、以及调试模式等设置。
-
设置系统路径 :环境变量
PATH
列出操作系统查找可执行程序的目录路径。系统在运行命令时,会按照PATH
中定义的目录顺序查找对应的可执行文件。意味着当我们将
test
加入到的绝对路径加入到PATH
后,那么我们就可以直接使用test
指令。 -
用户信息与系统设置 :环境变量还存储当前用户的相关信息(如
HOME
、USER
等),以及系统的临时目录路径(如TEMP
、TMP
)。 -
传递配置信息:环境变量为父进程向子进程传递配置信息提供了一个简便的方式。在运行进程时,操作系统会将当前环境变量复制到该进程中,使进程能直接读取这些变量。
在使用
gcc
编译程序时,环境变量主要起到配置应用程序 和设置系统路径的作用。