
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言:
- [一. 命令行参数:让程序接收外部输入](#一. 命令行参数:让程序接收外部输入)
- [二. 环境变量:定义系统运行环境](#二. 环境变量:定义系统运行环境)
-
- [2.1 常见环境变量及含义](#2.1 常见环境变量及含义)
- [2.2 环境变量的常用操作(终端命令)](#2.2 环境变量的常用操作(终端命令))
- [2.3 关键实验:环境变量的继承特性](#2.3 关键实验:环境变量的继承特性)
- [三. 代码层面操作环境变量](#三. 代码层面操作环境变量)
-
- [3.1 获取环境变量的 3 种方式](#3.1 获取环境变量的 3 种方式)
- [3.2 设置环境变量:`putenv` 函数(了解即可)](#3.2 设置环境变量:
putenv函数(了解即可))
- [四. 底层原理:环境变量的组织方式](#四. 底层原理:环境变量的组织方式)
-
- [4.1 存储结构](#4.1 存储结构)
- [4.2 继承机制](#4.2 继承机制)
- [4.3 为什么 ./myproc 才能运行,而 ls 不用?](#4.3 为什么 ./myproc 才能运行,而 ls 不用?)
- 结尾:
前言:
在 Linux 开发中,命令行参数和环境变量是两个核心基础:命令行参数让程序能接收外部输入,实现灵活配置;环境变量则定义了系统运行环境,影响程序的查找路径、权限等关键行为。无论是编写脚本、开发应用,还是日常运维,掌握这两者的用法都是必备技能。本文从命令行参数的解析、环境变量的常用操作,到代码层面的获取与设置,再到底层原理,层层递进帮你吃透这些知识点,从 "会用" 升级到 "理解本质"。
一. 命令行参数:让程序接收外部输入
命令行参数是程序运行时通过终端传入的参数,比如ls -l /home中,-l和/home都是ls命令的命令行参数。它让程序无需修改代码,就能根据外部输入调整行为。
命令行参数的基本结构:
C 语言程序中,命令行参数通过main函数的参数接收,标准结构如下:
cpp
#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 系统中用来指定运行环境的参数 ,具有全局特性 ,能被子进程继承。它决定了命令查找路径、用户主目录、默认编辑器等关键行为。
2.1 常见环境变量及含义
| 环境变量 | 核心作用 | 示例值 |
|---|---|---|
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 |
提示 :这些变量是系统运行和用户环境 的基础配置,对于软件兼容性、权限管理和命令执行至关重要。


2.2 环境变量的常用操作(终端命令)
(1)查看环境变量
bash
# 查看单个环境变量(推荐)
echo $PATH
echo $HOME
# 查看所有环境变量
env # 只显示环境变量
set # 显示环境变量+本地Shell变量
(2)设置环境变量
bash
# 临时设置(仅当前终端有效,重启终端失效)
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)删除环境变量
bash
unset MYENV # 删除环境变量MYENV

2.3 关键实验:环境变量的继承特性
环境变量的核心特性是可被子进程继承,而本地 Shell 变量不行,实验验证如下:
bash
# 1. 定义本地Shell变量(不export)
MYENV1="local var"
# 2. 定义环境变量(export)
export MYENV2="env var"
测试程序:
cpp
#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全局变量。
3.1 获取环境变量的 3 种方式
(1)通过main函数的第 3 个参数
cpp
#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声明:
cpp
#include <stdio.h>
extern char** environ; // 声明全局环境变量表
int main()
{
// environ
int i = 0;
for (; environ[i]; i++)
{
printf("environ[%d]: %s\n", i, environ[i]);
}
return 0;
}
(3)通过 getenv 函数(推荐)
专门获取指定环境变量,简洁高效:
cpp
#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;
}

3.2 设置环境变量:putenv 函数(了解即可)
cpp
#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;
}
四. 底层原理:环境变量的组织方式
4.1 存储结构
环境变量本质是一个以 NULL 结尾的字符指针数组,每个指针指向一个格式为 "KEY=VALUE" 的字符串,结构如下:

4.2 继承机制
- 父进程创建子进程时,会讲自己的环境变量复制给子进程;
- 子进程修改环境变量不会影响父进程(复制后独立);
export命令的作用是将本地 Shell 变量添加到环境变量表中,使其能被后续创建的子进程继承。
4.3 为什么 ./myproc 才能运行,而 ls 不用?
核心原因就是因为 PATH 这个环境变量:
ls命令所在的路径(/usr/bin)在PATH中,系统会自动在PATH的所有路径中查找命令;- 自定义程序
myproc不在PATH中,必须指定路径(./myproc表示当前目录)才能找到; - 解决方法:将程序所在路径添加到
PATH:
bash
export PATH=$PATH: ............

结尾:
html
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:命令行参数和环境变量是 Linux 开发的 "基础基石":命令行参数让程序更灵活,环境变量让系统环境可配置。掌握它们的用法,能让你在编写程序、日常运维时更加高效。本文覆盖了从基础用法到底层原理的核心知识点,结合实战案例帮你巩固理解。如果需要更复杂的场景,可以进一步深入学习。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど
