内置命令和名义上可以执行相同操作的另一个命令之间是否存在本质区别?
例如。内置函数是否得到“特殊”待遇? ...运行它们的开销是否更少? ..或者它们只是简单地“内置”;就像你汽车的仪表板一样?
...这些内置函数是否有明确的(当前)列表?
答案1
从您的评论来看,您似乎对到底什么是感到困惑壳是。内核负责管理系统。它是实际加载和运行程序、访问文件、分配内存等的部分。但是内核没有用户界面;您只能通过使用另一个程序作为中介来与其通信。
shell 是一种程序,它打印提示符,读取您的一行输入,然后将其解释为一个或多个命令来操作文件或运行其他程序。在 GUI 发明之前,shell 是操作系统的主要用户界面。在 MS-DOS 上,调用了 shell command.com
,人们通常不会更改它。然而,在 Unix 上,长期以来多个贝壳用户可以从中选择。
它们可以分为3种类型。 Bourne 兼容的 shell 使用源自原始版本的语法伯恩外壳。 C shell 使用原始语法C壳。还有一些非传统的 shell,它们发明了自己的语法,或者借用了某种编程语言的语法,并且通常比前两种类型更不受欢迎。
内置命令只是 shell 自行执行的命令,而不是将其解释为加载和运行某些其他程序的请求。这有两个主要影响。首先,它通常更快,因为加载和运行程序需要时间。当然,命令运行时间越长,加载时间与总体运行时间相比就越不重要(因为加载时间相当恒定)。
其次,内置命令可以影响 shell 的内部状态。这就是为什么像这样的命令cd
必须是内置的,因为外部程序无法更改 shell 的当前目录。其他命令(例如echo
)可能是为了提高效率而内置的,但没有内在原因它们不能成为外部命令。
哪些命令是内置的取决于您使用的 shell。您必须查阅其文档以获取列表(例如,bash
的内置命令列于其手册第 4 章)。该type
命令可以告诉您命令是否是内置的(如果您的 shell 是POSIX 兼容),因为 POSIX 要求它type
是内置的。如果which
不是您的 shell 中的内置程序,那么它可能不会知道您的 shell 的内置程序,而只会查找外部程序。
答案2
内置实用程序分为三个级别:
一些公用事业实际上是 shell 作为编程语言的一部分,尽管它们不是保留字。它们是控制流实用程序(
.
、:
、break
、continue
、return
、trap
、exit
、exec
、eval
)、参数相关实用程序(set
、unset
、shift
、export
、readonly
、local
1、typeset
1)、别名实用程序(alias
2、unalias
2)和times
3。这些特殊内置获得特殊待遇:- 如果将错误的参数传递给特殊的内置命令,shell 本身可能会中止,而不是在显示错误消息后跳到下一个命令。
- 预赋值语法
foo=bar utility
具有不同的含义:它是普通的参数赋值(即相当于foo=bar; utility
),而不是仅在实用程序的持续时间内分配给环境。
一些公用事业需要在 shell 内部实现,因为它们作用于 shell 的内部设置。这包括:
- 作用于 shell 当前目录的实用程序,例如
cd
,dirs
,pushd
,popd
; - 作业控制实用程序,例如
bg
、disown
、fg
、jobs
、wait
; - 读取或操作其他 shell 属性的实用程序,例如
builtin
,command
,hash
,read
,type
,ulimit
,umask
; - 与交互功能相关的实用程序(如果存在),例如
fc
、history
、bind
。
- 作用于 shell 当前目录的实用程序,例如
- 一些实用程序通常作为内置函数实现,纯粹是为了表现:
echo
,,,,, .printf
test
true
false
高级 shell 如巴什,克什和桀骜通常有更多的内置函数,通常用于实现非标准功能(通常用于交互)。每个 shell 的手册都会告诉你哪些命令是内置的,尽管有些 shell (桀骜至少)支持可动态加载的模块,可以提供更多内置模块。
1对于 POSIX 来说未知,但在 ksh 和其他几个 shell 中很特殊。
²在 POSIX 中很普通,但在 ksh 和其他几个 shell 中很特殊。
³ In ksh
,times
是围绕time
关键字:它是 的别名{ { time;} 2>&1;}
。请注意,POSIX 允许time
成为具有普通解析的外部实用程序或适用于整个管道的关键字(在 ksh 中,在 zsh 中是 bash)。
答案3
答案4
每个发行版和 shell 都有不同的命令集合和内置 shell 函数。一般来说,shell 的想法是内置最常见和最简单的功能,以节省时间、提高速度,并将其与其余功能集集成。开销要低得多,因为它不必启动另一个系统进程。然而,混合搭配是可能的。您可能会运行一个具有某种内置命令的 shell,但您的系统上也有该命令。通常内置函数会优先,但你可以控制它。
您可以通过运行轻松找出特定命令是否是内置命令type mycommand
。大多数 shell 手册页也有其内置函数的列表。
编辑:用于type
查明命令是否是内置命令,如果不是,则which
了解它将从何处执行。