Gil*_*il' 23
外壳和应用程序之间没有明显的界限。
您在 shell 中运行的某些命令必须内置到 shell 中,因为它们作用于 shell 进程。例如,cd更改shell的工作目录,这不能从外部完成,因此cd必须是内置命令。但这是一个实现细节。临时用户不需要知道强制cd成为内置命令的技术原因。
在另一个极端,有由不同作者开发的大型应用程序,例如 Firefox 或 Emacs。这些不会内置到任何外壳中,因为它们太大了。但这不是根本不可能,只是设计问题。例如,有 shells¹ 具有内置功能,可以制作简单的 GUI 应用程序。
在中间,有些命令可以走任何一条路。例如,echo命令不需要内置到 shell 中,但几乎每个 shell 都内置了它,因为它非常小,并且经常使用,所以应该是高效的。另一个例子是kill,对于临时使用,它可以是一个外部命令,但内置有几个优点:即使达到了进程数限制,您也可以调用它,并且可以给它一个 shell 作业数字 ( kill %2) 代替进程 ID。原则上,即使是[ … ]构造(也可以写成test)也可以是外部命令,但出于与echo.
如果您好奇,可以使用type命令检查给定命令的状态。例如,在我的设置中:
% type while type setenv cp emacs
while is a reserved word
type is a shell builtin
setenv is a shell function
cp is an alias for cp -i
emacs is /usr/bin/emacs
Run Code Online (Sandbox Code Playgroud)
诸如while和 之then类的保留字是 shell 语法的一部分。内置命令是内置在 shell 中的命令,不需要外部可执行文件。函数是由用户定义和命名的复合命令,可以通过它们的名称调用。别名是用户为较长命令定义的短名称(行为与函数不同)。最后一个示例是外部命令。
¹ dtksh。没有免费的实施。
尝试使用 bash 命令type。type描述命令是什么:如果它是一个内置的 shell,如果它是一个别名,如果它是另一个程序......
例子:
[braga@coleman ~]$ type echo
echo is a shell builtin
[braga@coleman ~]$ type ls
ls is aliased to `ls --color=auto'
[braga@coleman ~]$ type usermod
usermod is /usr/sbin/usermod
Run Code Online (Sandbox Code Playgroud)
有些是内置的,有些不是。使用type,如果你想了解具体的命令查询。bash有关所有内置函数的列表,请参阅文档。
内置命令包含在 shell 本身中。当内建命令的名称用作简单命令的第一个字时,shell 会直接执行该命令,而不调用其他程序。
当一个词用作简单命令的第一个词时,别名允许用一个字符串替换一个词。shell 维护一个别名列表,可以使用 alias 和 unalias 内置命令设置和取消设置这些别名。
两个引号都来自bash 手册。