Linux 命令行参数与环境变量:基础用法与底层原理
Linux 命令行参数和环境变量是开发与运维的核心技能。命令行参数通过程序入口接收外部输入,环境变量定义系统运行环境并支持子进程继承。常见环境变量含义、终端操作命令、代码获取设置方式以及底层存储结构与继承机制,帮助理解程序接收外部输入及系统环境配置的原理。

Linux 命令行参数和环境变量是开发与运维的核心技能。命令行参数通过程序入口接收外部输入,环境变量定义系统运行环境并支持子进程继承。常见环境变量含义、终端操作命令、代码获取设置方式以及底层存储结构与继承机制,帮助理解程序接收外部输入及系统环境配置的原理。

在 Linux 开发中,命令行参数和环境变量是两个核心基础:命令行参数让程序能接收外部输入,实现灵活配置;环境变量则定义了系统运行环境,影响程序的查找路径、权限等关键行为。无论是编写脚本、开发应用,还是日常运维,掌握这两者的用法都是必备技能。
命令行参数是程序运行时通过终端传入的参数,比如 ls -l /home 中,-l 和 /home 都是 ls 命令的命令行参数。它让程序无需修改代码,就能根据外部输入调整行为。
命令行参数的基本结构: C 语言程序中,命令行参数通过 main 函数的参数接收,标准结构如下:
#include <stdio.h>
// argc:参数个数(包含程序名本身)
// argv:字符串数组,存储具体参数(argv[0] 是程序名)
int main(int argc, char* argv[]) {
printf("程序名:%s\n", argv[0]);
printf("参数总数:%d\n", argc);
// 遍历所有参数
for (int i = 1; i < argc; i++) {
printf("参数%d:%s\n", i, argv[i]);
}
return 0;
}
argc=4:包含程序名 ./myproc,实际传入的参数是 3 个;argv[0] 固定为程序名,argv[1]~argv[argc-1] 是用户传入的参数。环境变量是 Linux 系统中用来指定运行环境的参数,具有全局特性,能被子进程继承。它决定了命令查找路径、用户主目录、默认编辑器等关键行为。
| 环境变量 | 核心作用 | 示例值 |
|---|---|---|
PATH | 指定命令的搜索路径,多个路径用 : 分隔 | /usr/bin:/bin:/usr/local/bin |
HOME | 指定用户的主工作目录 | /home/ubuntu (普通用户) /root (root 用户) |
SHELL | 当前使用的 Shell 类型 | /bin/bash |
USER | 当前登录用户名 | ubuntu |
LD_LIBRARY_PATH | 动态库的搜索路径 | /usr/lib:/usr/local/lib |
这些变量是系统运行和用户环境的基础配置,对于软件兼容性、权限管理和命令执行至关重要。
(1)查看环境变量
# 查看单个环境变量(推荐)
echo $PATH
echo $HOME
# 查看所有环境变量
env
# 只显示环境变量
set
# 显示环境变量 + 本地 Shell 变量
(2)设置环境变量
# 临时设置(仅当前终端有效,重启终端失效)
export MYENV="hello linux"
# 导出为环境变量(子进程可继承)
MYENV="hello"
# 仅为本地 Shell 变量(子进程不可继承)
# 永久设置(重启终端仍有效)
# 方法 1:修改用户级配置文件(仅当前用户)
echo 'export MYENV="hello linux"' >> ~/.bashrc
source ~/.bashrc # 生效
# 方法 2:修改系统级配置文件(所有用户)
sudo echo 'export MYENV="hello linux"' >> /etc/profile
source /etc/profile # 生效
(3)删除环境变量
unset MYENV # 删除环境变量 MYENV
环境变量的核心特性是可被子进程继承,而本地 Shell 变量不行,实验验证如下:
# 1. 定义本地 Shell 变量(不 export)
MYENV1="local var"
# 2. 定义环境变量(export)
export MYENV2="env var"
测试程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
char* var1 = getenv("MYENV1");
char* var2 = getenv("MYENV2");
printf("MYENV1:%s\n", var1 ? var1 : "未找到");
printf("MYENV2:%s\n", var2 ? var2 : "未找到");
return 0;
}
结论:只有 export 导出的环境变量能被子进程继承,本地 Shell 变量不能。
除了终端命令,还能通过代码获取、设置环境变量,核心依赖 getenv、putenv 等系统函数,以及 environ 全局变量。
(1)通过 main 函数的第 3 个参数
#include <stdio.h>
// env[]:环境变量数组,每个元素是"KEY=VALUE"格式
int main(int argc, char* argv[], char* env[]) {
(void)argc;
int i = 0;
for (; argv[i]; i++) {
printf("argv[%d]: %s\n", i, argv[i]);
}
printf("----------------------------------\n");
for (int i = 0; env[i]; i++) {
printf("env[%d]: %s\n", i, env[i]);
}
return 0;
}
(2)通过全局变量 environ
environ 是 libc 定义的全局变量,指向环境变量表,无需在 main 函数参数中声明,但需用 extern 声明:
#include <stdio.h>
extern char** environ; // 声明全局环境变量表
int main() {
int i = 0;
for (; environ[i]; i++) {
printf("environ[%d]: %s\n", i, environ[i]);
}
return 0;
}
(3)通过 getenv 函数(推荐)
专门获取指定环境变量,简洁高效:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("PATH: %s\n", getenv("PATH"));
printf("HOME: %s\n", getenv("HOME"));
printf("PWD: %s\n", getenv("PWD"));
printf("HOSTNAME: %s\n", getenv("HOSTNAME"));
printf("OK: %s\n", getenv("OK")); // 获取不存在的环境变量
return 0;
}
putenv 函数#include <stdio.h>
#include <stdlib.h>
int main() {
// 设置环境变量(格式:"KEY=VALUE")
int ret = putenv("MY_TEST=123456");
if (ret != 0) {
perror("putenv failed");
return 1;
}
// 验证设置结果
char* val = getenv("MY_TEST");
if (val) {
printf("MY_TEST:%s\n", val);
}
return 0;
}
环境变量本质是一个以 NULL 结尾的字符指针数组,每个指针指向一个格式为 "KEY=VALUE" 的字符串。
export 命令的作用是将本地 Shell 变量添加到环境变量表中,使其能被后续创建的子进程继承。核心原因就是因为 PATH 这个环境变量:
ls 命令所在的路径(/usr/bin)在 PATH 中,系统会自动在 PATH 的所有路径中查找命令;myproc 不在 PATH 中,必须指定路径(./myproc 表示当前目录)才能找到;PATH:export PATH=$PATH:………
命令行参数和环境变量是 Linux 开发的'基础基石':命令行参数让程序更灵活,环境变量让系统环境可配置。掌握它们的用法,能让你在编写程序、日常运维时更加高效。本文覆盖了从基础用法到底层原理的核心知识点,结合实战案例帮你巩固理解。如果需要更复杂的场景,可以进一步深入学习。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online