前言
在shell中可执行的命令分为内键命令和外部命令。在此之前,搞明白shell的内建命令和外部命令非常重要。下面将简要描述什么是内建命令和外部命令?
内建命令
内建命令不需要子进程来执行,它已经和shell编译为一体。作为shell工具的组成部分存在。不需要借助外部程序文件来运行。而常见shell内建命令有如下命令:
bind | 将键盘序列绑定到一个 readline 函数或宏 |
---|---|
cd | 将当前目录切换为指定的目录 |
dirs | 显示当前存储目录的列表 |
echo | 将指定字符串输出到 STDOUT |
exec | 用指定命令替换 shell 进程 |
export | 设置子 shell 进程可用的变量 |
fc | 从历史记录中选择命令列表 |
fg | 将作业以前台模式运行 |
getopts | 分析指定的位置参数 |
help | 显示帮助文件 |
history | 显示命令历史记录 |
jobs | 列出活动作业 |
kill | 向指定的进程 ID(PID) 发送一个系统信号 |
pwd | 显示当前工作目录的路径名 |
set | 设置并显示环境变量的值和 shell 属性 |
test | 基于指定条件返回退出状态码 0 或 1 |
times | 显示累计的用户和系统时间 |
type | 显示指定的单词如果作为命令将会如何被解释 |
umask | 为新建的文件和目录设置默认权限 |
unset | 刪除指定的环境变量或 shell 属性 |
wait | 等待指定的进程完成,并返回退出状态码 |
可以利用type命令来了解某个命令是否是内建的。
type echo
type cd
type ps
由此可见,如果是内建命令,会显示 shell 内嵌。则echo、cd 是一个 Shell 内建命令。而ps命令则显示 是位于/usr/bin/中,并不是shell的一部分。
内建命令的执行速度要更快,效率也更高。
说到这里要提请一下。有些命令有多种实现。常见的为echo、pwd这两个命令既是内建命令也是外部命令。如果只用type命令不带选项,则只会显示shell 内嵌。上面的例子也测试过 type echo。只会显示shell 内嵌。要查看命令的不同实现,必须使用type -a选项。
type -a echo
使用history命令
一个有用的内建命令history命令。bash shell会跟踪你用过的命令,这在开发过程中很重要。可以换回这些命令并重新使用。
用法:
要查看最近的用过的命令,可以输入不带选项的history使用。
histroy
在上面的截图中,因历史记录较多,只截屏了一小段信息。还用一种方法就是在终端输入 !! ,然后按回车键就能够换回刚刚用过的那条命令来使用。
外部命令
外部命令有时候被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令通常位于 /bin、/usr/bin、/sbin、/usr/sbin中。
可以使用which和type命令来找到。假设要找ps命令。
which ps
当然也可以使用type 命令来找:
这里要注意一下:which 命令只显示外部命令的文件。
外部命令的执行时,会创建一个子进程。这个操作被称为衍生。在执行速度相比内建命令来说,相对要慢些。这也因为外部命令程序通常位于/bin、/usr/bin、/sbin、/usr/sbin查找命令上需要时间。
外部命令 ps执行会创建子进程。
ps -f
ps命令执行时,创建子进程。从截图信息来看,ps的PID是4231,父PID为3437。而bash shell 父进程PID为3437。当进程必须执行衍生操作时,它需要花费时间和精力来设置新的子进程的环境。
总结
外部命令会创建出一个包含全新环境的子进程,而内建命令不会。相比之下,外部命令的使用成本更高。内建命令因为不需要创建新的环境,所以更高效,不会受到环境变化的影响。