Pet*_*r.O 77 shell bash utilities shell-builtin
内置命令和另一个名义上可以做同样事情的命令之间有什么内在的区别吗?
例如。内置函数是否得到“特殊”处理?...运行它们的开销是否更少?.. 或者它们只是简单地“内置”;像你汽车的仪表盘?
...是否有这些内置函数的明确(当前)列表?
cjm*_*cjm 101
从您的评论中,您似乎对shell 的确切含义感到困惑。内核负责管理系统。它是实际加载和运行程序、访问文件、分配内存等的部分。但内核没有用户界面;您只能通过使用另一个程序作为中介与它进行通信。
shell 是一个程序,它打印一个提示,从你那里读取一行输入,然后将它解释为一个或多个命令来操作文件或运行其他程序。在 GUI 发明之前,shell 是操作系统的主要用户界面。在 MS-DOS 上,shell 被调用command.com,人们通常不会更改它。然而,在 Unix 上,长期以来用户可以选择多种 shell。
它们可以分为3种类型。Bourne 兼容的 shell 使用源自原始Bourne shell的语法。C shell 使用原始C shell的语法。还有一些非传统的 shell,它们发明了自己的语法,或者从某种编程语言中借用了一种,并且通常比前两种类型更不受欢迎。
内置命令只是 shell 自己执行的命令,而不是将其解释为加载和运行其他程序的请求。这有两个主要影响。首先,它通常更快,因为加载和运行程序需要时间。当然,命令运行时间越长,加载时间与整体运行时间相比就越不重要(因为加载时间相当恒定)。
其次,内置命令可以影响 shell 的内部状态。这就是为什么cd 必须内置诸如此类的命令,因为外部程序无法更改 shell 的当前目录。其他命令,如echo,可能是内置的以提高效率,但没有内在的原因它们不能是外部命令。
内置哪些命令取决于您使用的 shell。您必须查阅其文档以获取列表(例如,其bash内置命令在其手册的第 4 章中列出)。该type命令可以告诉您命令是否是内置的(如果您的 shell 与POSIX 兼容),因为 POSIX 要求它type是内置的。如果which不是您的 shell 中的内置程序,那么它可能不会知道您的 shell 的内置程序,而只会寻找外部程序。
Gil*_*il' 38
内置实用程序分为三个级别:
一些实用程序实际上是作为编程语言的 shell 的一部分,即使它们不是保留字。它们是控制流实用程序 ( ., :, break, continue, return, trap, exit, exec, eval)、参数相关实用程序 ( set, unset, shift, export, readonly, local¹, typeset¹)、别名实用程序 ( alias², unalias²) 和times³。这些特殊的内置函数得到特殊处理:
foo=bar utility有不同的含义:它是一个普通的参数赋值(即等效于foo=bar; utility),而不是仅在实用程序的持续时间内赋值给环境。一些实用程序需要在 shell 内部实现,因为它们作用于 shell 的内部设置。这包括:
cd, dirs, pushd, popd;bg, disown, fg, jobs, wait;builtin, command, hash, read, type, ulimit, umask;fc、history、bind。echo, printf, test, true, false。诸如bash、ksh和zsh 之类的高级 shell通常具有更多内置函数,通常用于实现非标准功能(通常用于交互)。每个 shell 的手册都会告诉你哪些命令是内置的,尽管一些 shell(至少zsh)支持可以提供更多内置命令的动态加载模块。
¹ POSIX 未知,但在 ksh 和其他几个 shell 中很特别。
²在 POSIX 中很普通,但在 ksh 和其他几个 shell 中很特殊。
³ In ksh,times是time关键字的包装器:它是{ { time;} 2>&1;}. 请注意,POSIX 允许time成为具有普通解析功能的外部实用程序或适用于整个管道(在 ksh 中为 bash,在 zsh 中为 bash)的关键字。
Sha*_*off 10
内置命令是由 shell 提供的命令,而不是由外部程序提供的。以下是bash's builtins的列表(它们也在 bash 手册页中列出)和zsh's builtins。ksh通过运行提供一个列表builtin。
要知道特定命令是否是内置命令,您可以运行type command. 尝试type for并type ls看到这一点。