linux中的shell内置命令是什么?

时间:2010-07-07 06:23:17

标签: linux unix shell

我刚开始使用Linux,我很好奇如何定义cd等shell内置命令。

另外,如果有人可以解释它们是如何实施和执行的,我会很感激。

6 个答案:

答案 0 :(得分:14)

如果您想了解bash builtins如何定义,那么您只需要查看Section 4 of The Bash Man Page

但是,如果你想知道bash bultins是如何实现的,你需要查看the Bash source code因为这些命令被编译成bash可执行文件。

查看命令是否为bash内置的一种快速简便的方法是使用help命令。例如,help cd将向您展示如何定义'cd'构建的bash。同样适用于help echo

答案 1 :(得分:12)

实际的内置插件集因shell而异。有:

您可以使用大多数shell支持的type命令来确定该实用程序是否内置(尽管其输出未标准化)。来自dash的示例:

$ type ls
ls is /bin/ls
$ type cd
cd is a shell builtin
$ type exit
exit is a special shell builtin

Re cd实用程序,从理论上讲,没有什么能阻止shell实现者将其实现为外部命令。 cd无法直接更改shell的当前目录,但是,例如,cd可以通过套接字将新目录传递给shell进程。但没有人这样做,因为没有意义。除了非常旧的shell(没有内置插件的概念),cd使用了一些脏系统hack来完成它的工作。

如何在shell中实现cd?基本算法描述为here。它还可以做一些工作来支持shell的额外功能。

答案 2 :(得分:3)

佳丽, 从ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz检查bash shell的源代码 您会发现shell内置命令的定义不在单独的二进制可执行文件中,而是在shell二进制文件本身内(内置名称shell清楚地暗示了这一点)。

答案 3 :(得分:2)

每个Unix shell至少都有一些内置命令。这些内置命令是shell的一部分,并作为shell源代码的一部分实现。 shell认识到它被要求执行的命令是它的一个内置命令,并且它自己执行该操作,而不调用单独的可执行文件。不同的shell有不同的内置,但基本集中会有很多重叠。

有时,内置内容是出于性能原因而构建的。在这种情况下,$PATH中通常也有该命令的一个版本(可能具有不同的功能集,不同的识别命令行参数集等),但是shell决定将命令实现为一个内置的,这样它可以节省一个短暂的过程产生的工作,做一些它自己可以做的工作。这就是bash和printf的情况,例如:

$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.

请注意,在上面的示例中,printf既是shell内置的(作为bash本身的一部分实现),也是外部命令(位于/ usr / bin / printf)。请注意,它们的行为也不同 - 当不带参数调用时,内置版本和命令版本会打印不同的错误消息。另请注意,-v var选项(将此printf的结果存储到名为var的shell变量中)只能作为shell的一部分完成 - 像/ usr / bin / printf这样的子进程无法访问执行它们的shell的变量。

这将我们带到故事的第二部分:一些命令是因为它们需要而构建的。某些命令(如chmod)是围绕系统调用的薄包装器。运行/bin/chmod 777 foo时,shell forks,execs / bin / chmod(传递" 777"" foo")作为参数,新的chmod进程运行C代码chmod("foo", 777);然后将控制权返回给shell。但是,这对于cd命令不起作用。尽管cd看起来与chmod的情况相同,但它的行为必须不同:如果shell生成另一个进程来执行chdir系统调用,它将仅为此更改目录新生成的进程,而不是shell。然后,当进程返回时,shell将保持原样位于同一目录中 - 因此cd需要实现为内置shell。

答案 4 :(得分:1)

内置的Shell - http://linux.about.com/library/cmd/blcmdl1_builtin.htm 例如。 -

which cd 
/usr/bin/which: no cd in (/usr/bin:/usr/local/bin......

不是内置的shell而是二进制文件。

which ls
/bin/ls

答案 5 :(得分:0)

http://ss64.com/bash/这会对你有帮助。

这是shell脚本指南

http://www.freeos.com/guides/lsst/