每日科普 · 2026-10-24 周六
考研 408 × 求职面试
知识点 · Linux · 基础
环境变量与 PATH 的配置
环境变量是操作系统为每个进程保存的一组「键=值」字符串,用来传递配置信息,例如 HOME、USER、PATH。子进程会继承父进程的环境变量,所以在 shell 里 export 之后,新启动的程序就能读到这些变量。
PATH 是最常用的环境变量之一,它的值由若干目录用冒号拼接而成,例如 /usr/local/bin:/usr/bin:/bin。你在终端输入 ls 时,shell 不会凭空找到程序,而是按 PATH 中目录的顺序从左到右依次查找名为 ls 的可执行文件,找到第一个就执行。
配置方式:
1. 临时生效:执行 PATH=$PATH:/opt/bin 或 export MYVAR=xxx,只影响当前 shell 及其子进程,关掉终端就失效。
2. 永久生效:写入 ~/.bashrc(用户级,对交互式 bash 生效)或 /etc/profile(系统级,对所有用户生效),再用 source ~/.bashrc 立即生效,不必重新登录。
3. 常见坑:不要漏掉 $PATH,写成 PATH=/opt/bin 会把系统原有路径全部覆盖,导致大部分命令找不到;也不要把 . 放在 PATH 前面,否则当前目录下的同名恶意程序可能被优先执行。
每日一题 · Linux
环境变量与 PATH 的配置
某同学在 ~/.bashrc 中写入了 PATH=/opt/tools/bin,重新登录后发现 ls、vim 等命令都提示 command not found。原因是什么?正确写法应该怎样?
解析
原因:PATH 被整体覆盖,只剩 /opt/tools/bin 一个目录,系统原有的 /usr/bin、/bin 等路径全部丢失,shell 按 PATH 找不到 ls、vim 的可执行文件。正确写法是在原有值上追加或前置:PATH=$PATH:/opt/tools/bin(追加),或 PATH=/opt/tools/bin:$PATH(前置优先)。注意要 export PATH 才能传给子进程;改完用 source ~/.bashrc 或新开终端让配置生效。排查可用 echo $PATH 确认路径列表。
面试小贴士 · Linux
环境变量与 PATH 的配置
面试常问:PATH 查找机制、export 与直接赋值的区别、source 作用、程序里怎么读环境变量。答:进程各有环境副本,子进程继承父进程;shell 按 PATH 顺序找可执行文件。易错点:PATH 忘了带 $PATH、以为改了 .bashrc 对已开终端立即生效。
代码实现 · C
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
/* 1. 读取环境变量:getenv 返回指向值的指针,不存在则返回 NULL */
const char *path = getenv("PATH");
printf("PATH = %s\n", path ? path : "(未设置)");
/* 2. 设置环境变量:setenv 会把字符串复制进本进程的环境表 */
setenv("GREET", "hello", 1); /* 第 3 个参数 1 表示已存在时覆盖 */
/* 3. 子进程会继承环境变量,用 sh -c 验证 */
system("echo GREET=$GREET");
/* 4. execvp 会按 PATH 依次查找可执行文件,所以不必写绝对路径 */
char *argv[] = {"ls", "-l", "/", NULL};
execvp("ls", argv); /* 只有查找或执行失败才会返回 */
perror("execvp"); /* 例如误删 PATH 时打印错误原因 */
return 1;
}