2010-07-07 93 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內置實現。