2010-07-07 96 views
13

我刚刚开始使用Linux,我很好奇如何定义shell内置命令,如cd什么是linux内置shell命令?

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

+1

这与内核无关。 – 2010-07-07 23:05:12

回答

12

如果你想看到内建的bash是如何被定义然后你只需要看看Section 4 of The Bash Man Page

但是,如果您想知道bash布丁如何实现,您需要查看the Bash source code,因为这些命令被编译到bash可执行文件中。

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

3

佳丽, 检查bash shell中的源代码ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz 你会发现贝壳的定义内置命令中没有单独的二进制可执行文件,但它的外壳二进制文件本身(名称壳内置的内清楚地表明这一点)。

1

壳牌内装 - 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 
+2

不完全正确 - 有时内置和可执行文件重叠,例如。虽然有'/ bin/echo'程序,但大多数shell都提供自己的'echo'内建。 – 2010-07-07 09:41:50

+0

另一个例子是“时间” – 2014-05-27 11:38:14

11

内置实际内置套件因外壳而异。主要有:

您可以使用大多数shell支持的type命令(尽管其输出未标准化)了解该实用程序是否内置。从dash一个例子:

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

重新cd工具,理论上没有什么防止外壳实施者来实现它的外部命令。 cd不能直接更改shell的当前目录,但是,例如,cd可以通过套接字将新目录与shell进程进行通信。但没有人这样做,因为没有意义。除了非常老的shell(没有内置概念的地方),其中cd使用了一些肮脏的系统破解工具来完成它的工作。

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

2

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

有时,由于性能方面的原因,builtins内建。在这种情况下,在$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的是两个内置的壳(实现为bash的自身的一部分),以及一个外部命令(位于/ USR /斌/ printf的)。请注意,它们的行为也不同 - 当不带参数调用时,内置版本和命令版本会打印不同的错误消息。另请注意,-v var选项(将此printf的结果存储到名为var的shell变量中)只能作为shell的一部分完成 - 子进程(如/ usr/bin/printf)无法访问执行它们的shell的变量。

这让我们进入故事的第二部分:一些命令是内置的,因为它们需要。一些命令,如chmod,是系统调用的简洁包装。当您运行/bin/chmod 777 foo时,shell会fork,execs/bin/chmod(传递“777”和“foo”)作为参数,新的chmod进程运行C代码chmod("foo", 777);,然后将控制权返回给shell。但这不适用于cd命令。尽管cd看起来与chmod的情况相同,但它的行为有所不同:如果shell产生了另一个进程来执行chdir系统调用,它只会更改该新生成的进程的目录,而不会更改该目录。然后,当进程返回时,shell将被放置在与之前一样的目录中 - 因此需要将cd作为shell内置实现。