Linux 环境变量详解
基本概念
环境变量(Environment Variables)是一种动态命名值,用于影响操作系统及其运行程序的行为。环境变量可以在系统层面存储信息,使得不同的程序和进程能够共享和访问这些信息。
在安装软件时通常需要配置相应的环境变量,例如安装 Python 时可能需要通过环境变量找到相关工具;在编写 C/C++ 代码链接动态或静态库时,编译器依赖环境变量查找库文件位置。
命令行参数
在认识环境变量之前,先了解命令行参数。C/C++ 程序中 main 函数是入口,它会被调用并接收参数。在 Linux 中,_start 函数作为第一个执行的函数去调用 main 函数。
main 函数的常见签名如下:
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
return 0;
}
argc:整数,代表argv中元素的个数。argv:指针数组,指向一个个字符串,即命令行参数。
示例代码:
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
for (int i = 0; i < argc; i++) {
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
运行结果会显示程序名及后续参数。命令行参数本质上是长字符串,执行时被以空格为分隔符切分填入 argv,数组有效元素个数为 argc,且以 NULL 结尾。
命令行参数是由
bash来切分的。
认识环境变量
执行自己的程序通常需要加 ./,而执行系统命令可以直接使用程序名。这是因为系统中存在环境变量,帮助系统找到目标二进制文件。
默认情况下,执行命令不会在当前路径下查找,而是搜索环境变量 PATH 中指定的路径。系统命令通常存放在 /usr/bin/ 目录下,该路径包含在 PATH 变量中。
查看环境变量的方法:
env
查看特定环境变量内容:
echo $NAME
PATH 的值由多个绝对路径组成,路径之间以 : 隔开。执行命令时,操作系统按顺序在 PATH 中的路径查找。若未找到则报错 command not found。
修改 PATH 变量(临时生效):
export PATH=$PATH:/your/path
直接赋值会覆盖原有值,导致系统命令失效。建议追加路径。退出登录后变量恢复原状。
理解环境变量
环境变量由 bash 保存和管理。登录时系统创建 bash 进程,从配置文件读取环境变量信息,在内部形成环境变量表(指针数组)。
环境变量最初来自系统配置文件。用户家目录下的 .bashrc 和 .bash_profile 是常见的配置文件。.bash_profile 通常会加载 .bashrc,其中包含系统环境变量值的加载逻辑。
每个登录用户对应一个 bash 进程,各自构建独立的环境变量表。
常见的环境变量
- PWD:当前工作目录的完整路径,随目录变化自动更新。
- HOSTNAME:计算机的主机名。
- HISTSIZE:Shell 命令历史记录的最大条目数。
- LOGNAME:用户登录系统时使用的用户名。
- USER:当前登录用户。
- SHELL:当前使用的命令行解释器路径(如
/bin/bash)。 - HOME:用户的主工作目录,
cd ~即替换为此值。 - PATH:指定命令的搜索路径。
相关操作
echo $NAME:查看具体的环境变量值。env:查看所有环境变量。unset [name]:取消某一个环境变量。export [key-value]:导入新的环境变量。
在代码中获取环境变量
1. main 函数的参数
main 函数的第三个参数 env 即为环境变量表,由父进程传递。env 是以 NULL 结尾的指针数组。
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
(void)argc;
(void)argv;
for (int i = 0; env[i]; i++) {
printf("env[%d]: %s\n", i, env[i]);
}
return 0;
}
2. getenv 函数
使用标准库函数 getenv 根据名称获取环境变量值。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *value = getenv("PATH");
if (value == NULL)
return 1;
printf("PATH->%s\n", value);
return 0;
}
3. environ 全局变量
environ 是 libc 中定义的全局变量,指向环境变量表,需使用 extern 声明。
#include <stdio.h>
extern char **environ;
int main() {
for (int i = 0; environ[i] != 0; i++) {
printf("environ[%d]->%s\n", i, environ[i]);
}
return 0;
}
变量和内建命令
7.1 变量
Shell 中可直接定义本地变量,仅在当前 bash 内部使用,不可被子进程继承。
7.2 内建命令
export、echo、cd、history 等属于内建命令(built-in command),不需要创建子进程,由 bash 直接执行。
本文介绍了 Linux 环境变量的基本概念、管理方式以及在代码中的获取方法。掌握这些知识有助于更好地进行系统编程和环境配置。


