环境变量
环境变量
一.基本概念
在Linux系统中,环境变量是存储配置信息的键值对,用于动态影响系统和程序的行为。
核心概念
1.作用:
- 配置程序行为(如语言、路径、临时目录等)。
- 定义用户工作环境(如默认编辑器、Shell类型)。
2. 作用域:
- 全局变量:对所有用户和进程生效,通常通过系统级配置文件(如
/etc/environment
、/etc/profile
)设置。 - 用户级变量:仅对当前用户生效,通过用户配置文件(如
~/.bashrc
、~/.bash_profile
)设置。 - 临时变量:仅在当前Shell会话中有效,关闭终端后失效。
3. 继承性:
- 子进程(如脚本、程序)会继承父进程的环境变量,但子进程的修改不会影响父进程。
二.查看环境变量方法
echo $NAME //NAME:你的环境变量名称
eg:echo $PATH
:系统查找可执行文件的路径列表
echo $HOME
:当前用户的主目录路径
三.常见环境变量
变量名 | 作用 |
---|---|
PATH |
系统查找可执行文件的路径列表 |
HOME |
当前用户的主目录路径 |
USER |
当前用户名,标明当前用户 |
SHELL |
当前Shell的路径(如/bin/bash ) |
LANG |
系统语言和编码设置(如en_US.UTF-8 ) |
PWD |
当前工作目录 |
PS1 |
Shell命令提示符的格式 |
PATH
PATH的作用
我们自己编写的可执行程序也可以算是一种命令,而我们运行这个命令还需要加上./程序名,也就是该程序的路径,为什么?
当我们不加路径时,会出现command not found的报错,找不到该指令,所以需要加上程序的路径
而系统中的各个指令为什么就可以直接运行,而不需要路径呢?
其实,系统指令也是需要需要路径的,只是当我们登录时,环境变量已经帮我们把指令的路径加载好了,我们可以通过路径加系统指令验证
我们可以看到这两种方式运行的结果都是一样的,那系统指令的路径怎么设置的呢?我们可以直接查看系统变量中的路径
我们可以看到PATH早已把指令的路径配置好了。
此时我们提供两种方式(有很多方式)可以我们自己写的可执行文件不用再指明路径
- 将程序放入系统默认的 PATH 目录,这样虽然可以直接执行,但我们的代码未经检测,会污染系统的指令池
- 临时添加目录到 PATH(仅当前会话)
#export PATH=/home/chonbw/process/test 这样写是错误的,会导致PATH路径就剩下这个路径,会将其他路径全部覆盖,重新登录可解决
export PATH=$PATH:/home/chonbw/process/test #路径之间使用冒号分隔开
ps:其中我们以前使用过的which
指令也是根据PATH实现的
which是通过PATH来寻找指令所在的位置
PATH来源
系统通过这两个文件来为配置所有的环境变量,其中包括PATH
HOME
在linux使用echo $HOME
会打印出该使用者的家目录
我们使用普通用户执行该指令打印出了当前的家目录,但为什么提权后打印的还是普通用户的家目录呢?
当你在终端中运行 sudo echo $HOME
时,Shell 会按以下步骤处理:
-
先解析变量:Shell 会先解析
$HOME
,将其替换为 当前用户 的家目录(如/home/username
)。 -
再执行命令:将解析后的命令
sudo echo /home/username
提交给系统执行。
因此,sudo
实际执行的命令是 echo /home/username
,与当前用户的 $HOME
无关。
USER
在linux使用echo $USER
会打印出该使用者的名称
USER 环境变量的最大意义是可以标识当前的使用linux用户
此处sudo的理由如上。
我们还可以使用代码来获取环境变量,用来判断身份
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 int main()
5 {
6 char* who = getenv("USER"); //使用getenv函数来获取环境变量
7 if(strcmp(who,"root") == 0)
8 {
9 printf("user: %s \n", who);
10 }
11 else
12 {
13 printf("权限不足! \n");
14 }
15 return 0;
16 }
~
我们通过判断环境变量来获取身份,决定权限。USER是系统身份认证重要的一环
四.和环境变量相关的命令
命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
我们自己也可以设置一些本地变量,可以直接定义
例如上述这种,我们可以直接定义,直接定义的变量相当于是本地变量,使用env根本查不到
对于已经存在的本地变量,我们可以使用export 变量名 将其变为环境变量
我们还可以使用代码来获取环境变量
#include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #define MY_ENV "myval"
5 int main()
6 {
7 char* my_env = getenv(MY_ENV);
8 if(my_env == NULL)
9 {
10 printf("%s,not found\n", MY_ENV);
11 return 1;
12 }
13 printf("%s = %s \n",MY_ENV, my_env);
14 return 0;
15 }
总结
使用./myval --bash就是一个系统进程,myval也会变成一个进程(fork),是bash的子进程 --环境变量具有全局属性 --是会被子进程继承下去(为什么要,为了不同场景 --让bash帮我找指令 路径,进行身份认证)
使用myval=abc --本地变量 --只会在当前进程(bash)内有效
可见他简易的指令也是利用环境变量来实现的。
五.利用代码获取环境变量
命令行参数
命令行参数分别为int argc , char* argv[], char* env[]
我们知道了第二个参数可以接受外部传来的参数,我们可以试着写个框架出来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
if (argc != 2) {
printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n", argv[0]);
return 1;
}
// 检查第一个参数
if (strcmp("-a", argv[1]) == 0)
{
printf("功能a\n");
} else if (strcmp("-b", argv[1]) == 0)
{
printf("功能b\n");
} else if (strcmp("-c", argv[1]) == 0)
{
printf("功能c\n");
} else if (strcmp("-ab", argv[1]) == 0)
{
printf("功能ab\n");
} else if (strcmp("-ac", argv[1]) == 0)
{
printf("功能ac\n");
} else if (strcmp("-bc", argv[1]) == 0)
{
printf("功能bc\n");
} else if (strcmp("-abc", argv[1]) == 0)
{
printf("功能abc\n");
} else
{
printf("无效的参数: %s\n", argv[1]);
printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n", argv[0]);
return 1;
}
return 0;
}
通过代码获取环境变量
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[], char* env[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++)
{
printf("%s\n", environ[i]);
}
return 0;
}
上述代码结果相同,都是调出所有的环境变量
总结
在本文中,获取环境变量的方法有三种
- getenv
- char *env[]
- extern char **environ
推荐使用getenv来获取环境变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架