新来的同事在服务器上装了个工具,按文档执行 export PATH 加了一段路径,当前窗口能用,换一个 SSH 会话又找不到了,跑来问是不是命令写错了。
export 只影响当前 shell 和它启动的子进程,会话一关就没了。
它到底做了什么
shell 里定义的变量默认只在当前 shell 可见,加了 export 之后会放进环境变量表,子进程通过 environ 继承。所以脚本里能读到,同级的另一个终端读不到,这是设计如此。
临时和永久要分开
- 临时生效:直接 export NAME=value,关窗口即失效
- 当前用户永久:写进 ~/.bashrc 或 ~/.profile,重新登录生效
- 全局生效:写进 /etc/profile.d 下新建的 sh 文件,权限 644
写了 .bashrc 还是没用的原因
最常见的是改完没执行 source ~/.bashrc,或者用的是 zsh,读的是 ~/.zshrc。还有一种是登录方式和加载顺序不匹配,非交互式 shell 不读 .bashrc,脚本里要显式 source。用 sudo 执行时环境会被重置,PATH 也可能被 secure_path 覆盖,看 /etc/sudoers 里那一行。
查看和排查
export -p 列出当前所有导出的变量,env 看子进程实际拿到的环境,echo $NAME 确认值。排查时把命令拆开单独跑,别在一条长管道里猜。
几个写法上的坑
等号两边不能有空格,这一点和某些脚本语言不同。值里有空格要加引号,路径末尾别多写斜杠。PATH 追加要用冒号连接,写成空格会整条失效,连基础命令都找不到。
同事把路径写进 ~/.bashrc,source 之后新开会话也在。export 是会话级的工具,想长期存在,得落到配置文件里。