Linux 环境变量一次讲清:export、PATH 与启动文件
环境变量是什么
环境变量就是 shell 里全局可用的键值对,程序启动时会从父进程继承它。最常见的例子是 PATH:你在终端敲 ls,系统就是按 PATH 里列出的目录顺序去找 ls 这个程序。环境变量不写进代码、而是放在运行环境里,同一份程序换个环境就能换行为,部署时改配置不用改代码。
export:只在当前 shell 生效还是传给子进程
在 shell 里写 FOO=bar 只是给当前 shell 设了一个局部变量,子进程看不到;export FOO=bar 之后,当前 shell 再启动的程序才能继承它。验证方法很简单:开一个子 shell 看 echo $FOO 有没有值。很多人把变量写进脚本却没 export,结果程序里读不到,就是这个原因。
PATH:命令是怎么被找到的
PATH 是一串用冒号隔开的目录。敲一个命令时,shell 按顺序在每个目录里找同名可执行文件,找到第一个就停。所以同名程序装在两个地方时,排在前面的目录 wins。往 PATH 里加自己的目录要写 PATH=$PATH:/my/bin 再 export,顺序决定优先级。注意不要把当前目录 . 放进 PATH,安全风险很大,别人在你的目录里放一个叫 ls 的恶意脚本,你一敲 ls 就中招。
启动文件:.bashrc、.profile、.bash_profile 的分工
交互式登录 shell(比如 SSH 登录)读 .bash_profile 或 .profile;非登录的交互式 shell(新开一个终端标签页)读 .bashrc。常见的坑是把 PATH 写进 .bashrc,结果通过 SSH 跑非交互命令时读不到;或者写进 .profile,结果图形终端里读不到。稳妥的做法是把环境变量集中写在一个地方,比如 .profile 里写 export,再让 .bashrc 或 .bash_profile 去引用它,避免两份配置互相打架。
临时改与永久改
只想试一次就别改文件:命令行前面直接写 FOO=bar ./run.sh,这次运行有效,退出就没了。确认没问题再写进启动文件永久生效。改完启动文件不用重登,source ~/.bashrc 就能让当前 shell 重新加载。调试时用 env | grep FOO 看变量到底有没有进来,用 echo $PATH 看 PATH 是不是你以为的那个样子,别凭感觉猜。
三个常见坑
一是等号两边加空格,FOO = bar 会被当成命令不是赋值。二是 export 写进脚本但用 sh script.sh 运行,变量只活在子 shell 里,脚本退出就消失,要用 source script.sh 才进当前 shell。三是 PATH 越改越长还重复,启动越来越慢也难排查,改之前先备份原值,echo $PATH > ~/path.bak 留个后悔药。
- 点赞
- 收藏
- 关注作者
评论(0)