Linux shell 内建命令和外部命令

前言

在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。当进程必须执行衍生操作时,它需要花费时间和精力来设置新的子进程的环境。

总结

外部命令会创建出一个包含全新环境的子进程,而内建命令不会。相比之下,外部命令的使用成本更高。内建命令因为不需要创建新的环境,所以更高效,不会受到环境变化的影响。

发布了71 篇原创文章 · 获赞 42 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chen1415886044/article/details/103015950