1.shell命令分为内置命令和外部命令。
内置命令是shell解释程序内建的,由shell直接执行,不需要派生新的进程
外部命令分为二进制代码和shell脚本。
2.
(1)为了执行外部的二进制命令,需要一种机制,以允许子进程转换为将要被执行的命令。Unix/Linux调用exec可以做到这些。它允许一个进程用其他命令的可执行代码覆盖自己。二进制代码需要由磁盘装入内存中执行。shell解释程序会调用fork自身的一个拷贝,然后用exec系列函数来执行外部命令,这样外部命令就取代了当前的fork的子shell.
(2)shell脚本的执行与二进制文件略有不同。对于shell脚本来说,shell解释程序会fork一个子shell程序,子shell程序会检查脚本的第一行(如#!/bin/bahs),找到用来执行脚本的解释程序,然后装入这个解释程序,由它执行脚本程序。在此解释程序显然是当前shell的子进程。如果这个解释程序与当前使用的shell是同一种shell,比如都是bash,它就是当前shell的子shell,脚本中的命令都是在子shell环境中执行的,不会影响当前shell的环境。