环境变量
1077 字
5 分钟
环境变量
1. 环境变量基本概念
-
定义:环境变量是操作系统用来指定系统运行环境参数的特殊变量。
-
作用:
-
为系统或用户程序提供配置信息。
-
控制程序行为,如搜索路径、默认编辑器、语言设置等。
-
-
特性:
-
全局性:通常在整个系统或用户会话中有效。
-
持久性:可以保存在配置文件中,在系统重启后依然存在。
-
-
示例:在编译C/C++代码时,系统通过环境变量(如
PATH、LD_LIBRARY_PATH)找到链接库的位置。
2. 命令行参数
main函数的参数:
int main(int argc, char *argv[], char *env[])-
-
argc:命令行参数个数。-
argv:指向参数字符串指针数组。 -
env:指向环境变量字符串指针数组(可选)。
-
-
-
作用:命令行参数允许程序根据不同的输入参数执行不同的功能,实现程序选项功能。
-
示例:
./code a b c d对应 argv 数组:
argv[0] = "./code"argv[1] = "a"argv[2] = "b"argv[3] = "c"argv[4] = "d"3. PATH环境变量
-
作用:指定系统搜索可执行文件的默认路径列表。
-
查看方法:
echo $PATH-
路径分隔符:在Linux/Unix中使用冒号(
:),在Windows中使用分号(;)。 -
工作机制:当输入一个命令时,系统会按照PATH中的路径顺序查找对应的可执行文件。
4 环境变量的存储与来源
-
存储位置:每个进程(包括bash)都维护一张环境变量表。
-
环境变量来源:
-
系统级配置文件:
-
/etc/profile:系统全局配置文件。 -
/etc/bashrc:系统级bash配置。
-
-
用户级配置文件:
-
~/.bash_profile:用户登录时执行。 -
~/.bashrc:每次启动bash时执行。
-
-
-
多用户环境:每个登录用户都有自己独立的bash进程,拥有独立的环境变量表。
5 常用环境变量
| 变量名 | 含义 | 示例 |
|---|---|---|
PATH | 可执行文件搜索路径 | /usr/bin:/usr/local/bin |
HOME | 当前用户的家目录 | /home/kiana |
USER | 当前用户名 | whb |
SHELL | 当前使用的Shell | /bin/bash |
PWD | 当前工作目录 | /home/kiana/code |
LANG | 语言和字符集设置 | en_US.UTF-8 |
LD_LIBRARY_PATH | 动态库搜索路径 | /usr/local/lib |
PS1 | 命令行提示符格式 | [\u@\h \W]\$ |
6. 环境变量的操作
查看环境变量
env # 显示所有环境变量echo $PATH # 显示特定环境变量printenv PATH # 显示特定环境变量设置环境变量
# 临时设置(仅在当前shell有效)export MY_VAR="hello" # 设置为环境变量MY_LOCAL_VAR="world" # 设置为本地变量(仅当前shell)
# 永久设置(添加到配置文件)# 在~/.bashrc或~/.bash_profile中添加:# export MY_VAR="permanent_value"取消环境变量
unset MY_VAR # 删除环境变量7. 在程序中获取环境变量
方法一:通过main函数的第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[]){ for(int i = 0; env[i] != NULL; i++) { printf("env[%d]: %s\n", i, env[i]); } return 0;}方法二:使用全局变量environ
#include <stdio.h>#include <unistd.h>
extern char **environ; // 声明外部全局变量
int main(){ for(char **env = environ; *env != NULL; env++) { printf("%s\n", *env); } return 0;}方法三:使用getenv()函数
#include <stdio.h>#include <stdlib.h>
int main(){ char *path = getenv("PATH"); if(path != NULL) { printf("PATH: %s\n", path); }
// 安全示例:限制特定用户执行程序 char *user = getenv("USER"); if(user != NULL && strcmp(user, "admin") == 0) { printf("Welcome admin!\n"); // 执行管理员操作 } else { printf("Access denied!\n"); return 1; } return 0;}8 环境变量的继承特性
-
继承机制:父进程的环境变量会自动传递给子进程。
-
bash启动子进程的过程
// 简化表示bash启动子进程的逻辑int start_child_process(){ int ret = 0; int arg_count = 0;
// 准备参数和环境变量 char *argv[] = {"./program", "arg1", "arg2", NULL}; char *envp[] = {"PATH=/usr/bin", "HOME=/home/user", NULL};
// 根据参数数量调用main函数 if(arg_count == 0) ret = main(); else if(arg_count == 2) ret = main(argc, argv); else ret = main(argc, argv, envp);
return ret;}9. 环境变量 vs 本地变量
| 特性 | 环境变量 | 本地变量 |
|---|---|---|
| 作用域 | 全局,可被子进程继承 | 仅在当前shell有效 |
| 设置方法 | export VAR=value | VAR=value |
| 查看方法 | env, printenv | set (显示所有变量) |
| 示例 | export PATH=/new/path | count=10 |
| 用途 | 配置系统行为 | 临时存储,脚本内部使用 |
-
bash内部维护两套变量表:环境变量表和本地变量表。
-
内建命令(built-in command):如
export、cd等,由bash直接执行,不创建子进程。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
linux基础知识点
Linux 系统图形界面 vs 命令行: 所有操作系统最初都只有命令行界面。 Windows 和 Linux Desktop 虽有图形界面,但终端命令操作是核心与基础。
2
线程同步与互斥
Linux 系统线程共享地址空间:同一个进程内的多个线程共享进程的虚拟地址空间。
3
进程优先级、切换与调度
Linux 系统是什么:进程获得CPU资源的先后顺序。
4
进程状态
Linux 系统进程状态在操作系统中体现为 taskstruct 结构体中的一个整数标志。理论模型通常包含以下状态:
5
进程管理
Linux 系统内核观点:担当分配系统资源(CPU时间,内存)的实体。
随机文章随机推荐

