![为什么 Bash 在子 shell 中运行脚本?](https://linux22.com/image/172249/%E4%B8%BA%E4%BB%80%E4%B9%88%20Bash%20%E5%9C%A8%E5%AD%90%20shell%20%E4%B8%AD%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
为什么 Bash shell 在子 shell 中运行脚本?这样做有什么好处呢?
答案1
shell 最初被称为系统的“用户界面”,被赋予的职责是执行程序(又名任务)。要调用任务,shell 会依次要求内核执行该任务。内核管理任务将使用的内存以及读取或写入文件的权限。要要求内核“执行”一个程序,基本方法是叉一个新任务(给它一个新的 PID(进程号)),然后执行新 PID 中的新程序。内核将收到一个参数列表:
int execve(const char *filename, char *const argv[], char *const envp[]);
基本上要求内核使用filename
参数执行argv[]
。内核执行要求执行的操作,当程序终止时,控制权返回到父进程。
以外壳为执行人对于程序来说,它是一个明显的扩展,它还可以执行某些解释器可以理解的文本文件。这就是#! /interpreter
内核也理解的shebang 机制。
因此,shell 可以(有时确实)“执行脚本”,但最自然的执行顺序是要求内核像处理任何其他程序一样:加载程序并赋予其进程控制权 (PID)。
预计在不同 PID 内执行的任何程序都不会污染父 PPID。也就是说:一个 PID 的变化不会影响父 PID。
因此,当“脚本”被执行时,它(通常)会获得一个新的 PID。它是被称为子 shell 还是子 shell 有时会令人困惑,但重要的是它在不同的 PID 内运行。通常是子进程(PID)。