终端里敲 java -version 一切正常,写进 crontab 就报 command not found,十个有九个是环境变量的问题。这就得说说 linux export 到底干了什么。

export 的作用一句话

Shell 里定义的变量默认只在当前会话有效,子进程看不到。export 把变量导出到环境里,之后启动的子进程才能继承。对比一下:

name=hello
export name=hello

第一种在子进程里取不到值,第二种可以。想看当前导出了哪些变量,跑 export -p;查路径变量就 echo $PATH。

最常见的用法:追加 PATH

export PATH=$PATH:/opt/myapp/bin

注意 $PATH 必须带上,漏了它等于把原有路径全清空,大部分命令瞬间 not found,这种事故很常见,救回来就是把上一句撤销重敲。配完用 which 命令名 验证,看实际找到的是哪个路径,一眼确认生效没有。

几个常见误区

  • 以为 export 一次永久有效:换个终端、重启机器就打回原形,关键变量必须落配置文件。
  • 脚本里 export 的变量,脚本跑完就没了:想让当前终端生效,直接 source 这个脚本。
  • 子进程改环境变量传不回父进程:传递方向永远从上往下,没有反向通道。

为什么关个窗口就没了

命令行里执行 export 只对当前会话生效,窗口一关就消失。想永久生效要写进配置文件:只影响自己写 ~/.bashrc 或 ~/.bash_profile,所有用户生效写 /etc/profile,改完 source 一下文件,当前会话立即生效。crontab 里找不到命令也是同类问题,它不加载这些配置,要么在脚本里自己 export,要么命令写绝对路径。

同一个变量在多处配置文件里都写过,后加载的会覆盖先加载的,排查怪问题时先想到这点。记一句就够:临时用命令行 export,长期用写 bashrc,写完记得 source。