把linux 命令的三种身份搞清楚

先给大家画张图,把Linux命令的三种身份搞清楚。第一种是内建命令,这就像是Shell自带的肌肉。你敲下“cd”,Shell会立马在内存里搞定目录切换,连新进程都不用创建。像“set”这种管Shell行为的命令,还有“echo”这种管I/O的命令都属于这一类。因为效率高,大家在写脚本的时候基本都离不开它们。 第二种是Shell函数,你可以把常用的命令序列包装起来。下次直接调用函数名就行,既省事又好维护。它们不用单独开进程,所以特别轻量。 第三种是外部命令,这类程序是独立于Shell的可执行文件。每次执行都要先克隆出一个一模一样的子进程,再在子进程里跑程序。像“find”和“grep”这样功能全但体积大的命令就属于这一类。 最后咱们来做个小实验:运行./a.sh或者sh a.sh的时候,Shell会先fork出一个新的子进程。子进程读取环境变量后,里面的PWD就指向了当前目录。接着它在自己内部执行cd和echo这些操作。这时候你会发现父进程的PWD没变,因为改动只发生在子进程里。 要是想让脚本的改动立刻生效怎么办?那就用source命令或者点号“.”来执行脚本吧。它不创建子进程,直接在父进程里运行代码。修改环境变量或者初始化文件的时候特别方便——不用重启终端就能看到效果。一句话说:source是让脚本在“本体”上动刀子,前两种都是在“克隆”上动手脚。