环境变量

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环境变量#

  • 作用:指定系统搜索可执行文件的默认路径列表。

  • 查看方法:

/home/user/bin
echo $PATH
  • 路径分隔符:在Linux/Unix中使用冒号(:),在Windows中使用分号(;)。

  • 工作机制:当输入一个命令时,系统会按照PATH中的路径顺序查找对应的可执行文件。

4 环境变量的存储与来源#

  • 存储位置:每个进程(包括bash)都维护一张环境变量表。

  • 环境变量来源:

    1. 系统级配置文件:

      • /etc/profile:系统全局配置文件。

      • /etc/bashrc:系统级bash配置。

    2. 用户级配置文件:

      • ~/.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. 环境变量的操作#

查看环境变量#

Terminal window
env # 显示所有环境变量
echo $PATH # 显示特定环境变量
printenv PATH # 显示特定环境变量

设置环境变量#

Terminal window
# 临时设置(仅在当前shell有效)
export MY_VAR="hello" # 设置为环境变量
MY_LOCAL_VAR="world" # 设置为本地变量(仅当前shell)
# 永久设置(添加到配置文件)
# 在~/.bashrc或~/.bash_profile中添加:
# export MY_VAR="permanent_value"

取消环境变量#

Terminal window
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启动子进程的过程

Terminal window
// 简化表示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=valueVAR=value
查看方法env, printenvset (显示所有变量)
示例export PATH=/new/pathcount=10
用途配置系统行为临时存储,脚本内部使用
  • bash内部维护两套变量表:环境变量表和本地变量表。

  • 内建命令(built-in command):如export、cd等,由bash直接执行,不创建子进程。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
HandlerOne
おかえり
公告
本站已整理 138 篇技术笔记,并按 8 条主线排成学习路线(141 站);站内搜索与桌宠对话均已上线。
分类
标签
最新动态
站点统计
文章
138
分类
12
标签
42
总字数
597,044
站点信息
构建平台
腾讯云 · Nginx
博客版本
v6.16.8
文章目录