先说结论:
因为 PATH 变量是从上一层继承过来的,默认就是环境变量,所以在 shell 这一层不需要通过 export 命令让它成为环境变量
再说证据:
http://git.savannah.gnu.org/cgit/bash.git/tree/execute_cmd.c 的 execute_disk_command 函数里执行了
exit (shell_execve (command, args, export_env));
其中 export_env 是从 variables.c 里边来的,被 execute_disk_command 调用 shell_execve 之前稍早几句的 maybe_make_export_env (); 写入内容的一个数组
再看 variables.c 文件,maybe_make_export_env 调用了 make_var_export_array,后者又调用了 export_environment_candidate,而最后这个函数只有一句话:
return (exported_p (var) && (invisible_p (var) == 0 || imported_p (var)));
关键在于 imported_p。这个 imported_p 并不是个函数而是一个宏,在 variables.h 里定义的,判断条件里的 att_imported 吸引了我。再搜 att_imported,发现 initialize_shell_variables 函数执行的时候会对部分变量标记 att_imported ( att 即 attribute )
最后说值的继承关系:
在 systemd 为基础的 Linux 发行版里,systemd-exec(5)准备了固定值 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
检查 /proc/pid/environ 可以发现,sshd 和 getty 的 PATH 环境变量值均于此一致