马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
环境变量是 shell 给进程预留的一张键值表。它决定了你去敲一条命令时系统去哪儿找可执行文件、你的文件放在哪儿、默认用哪个编辑器。Unix 里有一句老话:环境变量就是进程的「环境」。
一、先看清你有哪些变量
echo $NAME # 读取单个变量
env # 列出当前进程全部环境变量
set # 列出 shell 里的全部变量(含本地变量)
env 和 set 输出的区别,正是「环境变量」与「本地变量」的分界:前者会被子进程继承,后者不会。
二、修改与删除
NAME=linux # 只赋值给本地变量
export NAME=linux # 赋值并标记为环境变量(子进程可见)
unset NAME # 删除
注意顺序:先赋值、后 export。直接 export NAME=linux 是一条更短的等价写法,但老写法更容易看出变量存在于哪个阶段。
三、PATH:最常用的那个变量
你在终端敲 ls 能执行,是因为 shell 沿着 PATH 里存的一串目录依次找 ls 这个可执行文件,第一个命中的生效。
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 分隔符是冒号,不是分号
export PATH=$PATH:/home/user/bin
把自建脚本目录追加到 PATH 尾部,比放到前面安全——前面意味着同名命令会覆盖系统命令。多个路径之间只能用英文冒号 : 分隔。
四、让改动永久生效的三个位置
直接 export 只对当前终端窗口有效,重开就没了。要长期保留,得写进 shell 启动文件:
- 当前用户:
~/.bashrc(非登录 shell)、~/.bash_profile 或 ~/.profile(登录 shell)。通用做法是写在 ~/.bashrc。
- 全体用户:
/etc/profile 再由它 source /etc/profile.d/*.sh 加载子目录里的脚本。给团队机器配统一环境,往 /etc/profile.d/ 丢一个 .sh 是最省事的做法。
- 临时会话:命令行直接 export,只活到本次登录结束。
# 写入用户级配置
echo 'export MY_PROJECT=/data/workspace/myproject' >> ~/.bashrc
source ~/.bashrc # 不重开终端也能立刻生效
五、进程视角:环境表长什么样
每个进程都有一张环境表,程序启动时被塞进来。C 语言里可以通过 main 的第三个参数拿到完整指针数组:
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {
for (int i = 0; envp[i] != NULL; i++) {
printf("%s\n", envp[i]);
}
return 0;
}
运行起来你会看到每一行都是 名字=值 的形式,和 env 命令的输出一一对应。库函数侧则用 getenv("NAME") 单点查询,返回字符串,查不到返回 NULL。
六、本地变量 vs 环境变量,边界在哪
- 本地变量只在当前 shell 进程里存在,不会传给子进程。
- export 之后才变成环境变量,才会被
fork 出来的子进程继承。
- 子进程无法修改父进程的环境变量,它拿到的是一份拷贝。
七、容易混的两类命令
echo 和 cd 是 shell 内建命令,由 shell 自己解释执行,不 fork 新进程,所以在这两条命令前面加 export 之类的操作语义会绕。反过来,ls、cp 这些是外部可执行文件,它们的运行完全依赖 PATH 能否找到。
八、排障清单
- 命令突然找不到 →
echo $PATH 看目录还在不在。
- 配了环境变量但读取为空 → 检查是不是写在了非登录 shell 才加载的文件里,或漏了
source。
- 想只对单条命令生效 →
NAME=value command 这种前缀写法,比全局 export 干净。
结论
环境变量是一张跨进程传递配置的最低成本通道:读用 echo $X,写用赋值加 export,长期生效写进 ~/.bashrc 或 /etc/profile.d/,程序侧从 envp[] 或 getenv 读取。把这张表的生命周期想清楚,shell 里八成的「配了没生效」问题都能自己定位。
qidao123.com企服评测-应用市场 编辑提示 |