内置命令和非内置命令有什么区别?

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 的内置程序,而只会寻找外部程序。

  • @George:应用程序通过发出系统调用与内核通信,这取决于操作系统和体系结构可能会或可能不会使用中断。用户通常不会发出中断。 (11认同)
  • @cjm:当你这样解释时听起来很简单:)......你肯定帮助清除了雾......现在只是薄雾......(实际上这就是今天早上这里的天气。 .. 雾蒙蒙的 ;) ... 谢谢 (2认同)
  • @cjm 非常彻底和有启发性的答案。阅读它我学到了很多。:) (2认同)

Gil*_*il' 38

内置实用程序分为三个级别:

  • 一些实用程序实际上是作为编程语言的 shell 的一部分,即使它们不是保留字。它们是控制流实用程序 ( ., :, break, continue, return, trap, exit, exec, eval)、参数相关实用程序 ( set, unset, shift, export, readonly, local¹, typeset¹)、别名实用程序 ( alias², unalias²) 和times³。这些特殊的内置函数得到特殊处理:

    • 如果将错误的参数传递给特殊的内置函数,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;
    • 与交互功能相关的实用程序,当它们存在时,例如fchistorybind
  • 一些实用程序通常作为内置程序实现,纯粹是为了提高性能echo, printf, test, true, false

诸如bashkshzsh 之类的高级 shell通常具有更多内置函数,通常用于实现非标准功能(通常用于交互)。每个 shell 的手册都会告诉你哪些命令是内置的,尽管一些 shell(至少zsh)支持可以提供更多内置命令的动态加载模块。

¹ POSIX 未知,但在 ksh 和其他几个 shell 中很特别。
²在 POSIX 中很普通,但在 ksh 和其他几个 shell 中很特殊。
³ In ksh,timestime关键字的包装器:它是{ { time;} 2>&1;}. 请注意,POSIX 允许time成为具有普通解析功能的外部实用程序或适用于整个管道(在 ksh 中为 bash,在 zsh 中为 bash)的关键字。

  • 这些区别才是真正重要的区别。 (3认同)

Sha*_*off 10

内置命令是由 shell 提供的命令,而不是由外部程序提供的。以下是bash's builtins的列表(它们也在 bash 手册页中列出)和zsh's builtinsksh通过运行提供一个列表builtin

要知道特定命令是否是内置命令,您可以运行type command. 尝试type fortype ls看到这一点。