Shell 执行机制
在 Shell 中,理解进程隔离和环境变量继承机制,是掌握脚本执行行为的基础。
一、 子进程与脚本执行
当我们在终端执行一个外部脚本(如 ./script.sh 或 bash script.sh)时,当前终端(父进程)会 fork 出一个全新的子进程来执行该脚本。
- 进程隔离:子进程拥有独立的内存空间。脚本中进行的变量赋值、
cd操作等,只会在子进程内部生效。 - 生命周期:脚本执行完毕后,子进程销毁,其中的所有变量修改随之丢失,不会影响父进程(当前终端)。
二、 export 的作用
核心作用:将 Shell 局部变量升级为环境变量,实现向子进程的单向传递。
- 局部变量:
VAR="hello"仅在当前 Shell 有效。启动子进程时,子进程无法读取该变量。 - 环境变量:
export VAR="hello"后,当前 Shell 及其后续启动的所有子进程都能读取该变量。 - 局限性:
export只能向下(子进程)传递,无法向上(父进程)传递。在脚本中export变量,脚本结束后父进程依然无法获取。
三、 source 命令的作用
核心作用:在当前 Shell 进程中直接执行脚本,不创建任何子进程(相当于把脚本内容直接复制粘贴到终端里执行)。
使用 source script.sh(或 . script.sh)时:
- 不会
fork子进程。 - 脚本内的所有命令、变量赋值、
export均在当前终端进程中执行。 - 脚本执行完毕后,当前终端的环境(变量、PATH、别名等)会被真实改变。
总结:./ 开启新进程,修改不外传;export 让变量向下继承;source 在当前进程执行,直接改变当前终端环境。
