如何分辨linux里的那几种命令

咱们来聊聊怎么分辨 Linux 里的那几种命令。最简单的内建命令,其实就是 Shell 自己的原生功能,就好比它自带的肌肉。你打个 cd 切换目录,压根不需要开个新的进程来折腾,这事儿直接就在内存里干完了。有些内建命令是管 Shell 本身怎么运作的,比如 set;还有的专门负责输入输出,像 echo 就是最典型的例子。正因为这些命令“零成本”,大家写脚本的时候特别喜欢用,算是效率党眼里的香饽饽。 除了内建命令,还有一种叫 Shell 函数。这玩意儿说白了就是把一串常用的代码打包成个小模块,用的时候直接拿名字调用就行。这样既能少敲不少字,维护起来也方便。这种函数跟内建命令一样也不单独跑个进程,特别轻巧。 最麻烦的当属外部命令了。这玩意儿是独立的程序,执行的时候必须得先给 Shell 克隆个一模一样的子进程出来,然后在子进程里把目标程序给跑起来。等子进程里的事儿都干完了,父进程才能继续往下走。像 find 和 grep 这类命令虽然功能强大,个头也不小,但这也就意味着会多出不少额外开销。 咱们做个实验就能看明白这三种身份。当你去执行 ./a.sh 或者 sh a.sh 的时候,Shell 大概会这么做:一看这不是内建命令,立马 fork 出一个新的子 Shell;子进程刚一出来就会去读环境变量,里面的 PWD 自然就指向当前的目录;接着子进程里就开始跑脚本里的那些命令,比如先切换目录再打印点啥;等子进程彻底结束了,父进程才继续往下看。因为 PWD 其实是在子进程里才变的,所以看上去目录好像压根没变过。 要是想让脚本的改动马上生效到当前的 Shell 环境里,你得用 source(或者写成 .)。这招可厉害啦,它根本不新建子进程,直接就在父进程里把脚本给跑了。改改环境变量或者初始化配置的时候特别好用——改动瞬间就能看到效果,根本不用重启终端窗口。 一句话总结:source 是在“本体”上动刀子修改环境;其他两种都像是在“克隆”出来的环境上动手脚。