是不是所有可以在 bash 中运行的命令实际上都不属于 bash?我逐渐意识到我一直混淆了 shell 和可以在其中运行的应用程序。
答案1
shell 和应用程序之间没有明显的界限。
在 shell 中运行的某些命令必须内置到 shell 中,因为它们作用于 shell 进程。例如,cd
更改 shell 的工作目录,这不能从外部完成,因此cd
必须是内置命令。但这是一个实现细节。临时用户不需要知道有技术原因迫使cd
其成为内置命令。
另一个极端是由不同作者制作的大型应用程序,例如 Firefox 或 Emacs。这些不会被内置到任何 shell 中,因为它们太大了。但这并不是根本不可能,只是设计问题。例如,有一些 shell 具有内置功能,可以创建简单的 GUI 应用程序。
中间有一些可以任意执行的命令。例如,该echo
命令不需要内置到 shell 中,但几乎每个 shell 都内置它,因为它非常小,并且经常使用,所以应该是高效的。另一个例子是kill
,对于随意使用来说,它可以是一个外部命令,但是拥有一个内置命令有几个优点:即使您已经达到了进程数量的限制,您也可以调用它,并且您可以给它一个 shell 作业数字 ( kill %2
) 代替进程 ID。即使[ … ]
构造(也可以写成test
)原则上也可以是外部命令,但出于与 相同的原因内置到 shell 中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
保留字(例如while
和 )then
是 shell 语法的一部分。内置命令是内置于 shell 中的命令,不需要外部可执行文件。函数是由用户定义和命名的复合命令,可以通过其名称进行调用。别名是用户定义的较长命令的短名称(与函数的行为不同)。最后一个示例是外部命令。
^ 德特克什。没有免费的实施。
答案2
尝试使用 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
有些是内置的,有些不是。type
如果您想查询特定命令,请使用。请参阅bash
文档以获取所有内置函数的列表。
- 什么是内置?
内置命令包含在 shell 本身内。当内置命令的名称用作简单命令的第一个单词时,shell 直接执行该命令,而不调用其他程序。
- 什么是别名?
别名允许在用作简单命令的第一个单词时用字符串替换单词。 shell 维护一个别名列表,可以使用 alias 和 unalias 内置命令设置和取消设置。
两段引文均来自bash手册。
答案3
- 大多数命令不是 shell 的一部分。 (Shell 仅运行该名称的二进制文件。)
- 外壳机具光盘它是脚本语言关键字(while、for 等)
- 命令如回声和测试可能会也可能不会在 shell 中实现。