一,什麼是Shell?
shell是你(用戶)和Linux(或者更准確的說,是你和Linux內核)之間的接口程序。你在提示符下輸入的
每個命令都由shell先解釋然後傳給Linux內核。
shell 是一個命令語言解釋器(command-languageinterpreter)。擁有自己內建的shell命令集。此外,
shell也能被系統中其他有效的Linux 實用程序和應用程序(utilities andapplicationprograms)所調用。
不論何時你鍵入一個命令,它都被Linux shell所解釋。一些命令,比如打印當前工作目錄命令(pwd),
是包含在Linux bash內部的(就象DOS的內部命令)。其他命令,比如拷貝命令(cp)和移動命令(rm),是存在於
文件系統中某個目錄下的單獨的程序。而對用戶來說,你不知道(或者可能不關心)一個命令是建立在shell內部還
是一個單獨的程序。
二,shell 是如何執行命令解釋的?
shell 首先檢查命令是否是內部命令,不是的話再檢查是否是一個應用程序,這裡的應用程序可以是Linux
本身的實用程序,比如ls 和 rm,也可以是購買的商業程序,比如xv,或者是公用軟件(public domain software),
就象Ghostview。然後shell試著在搜索路徑裡尋找這些 應用程序。搜索路徑是一個能找到可執行程序的目錄列表。
如果你鍵入的命令 不是一個內部命令並且在路徑裡沒有找到這個可執行文件,將會顯示一條錯誤 信息。而如果命令
被成功的找到的話,shell的內部命令或應用程序將被分解為 系統調用並傳給Linux內核。
shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持在高級語言裡所
能見到的絕大多數程序控制結構,比如循環,函數,變量和數組。shell 編程語言很易學,並且一旦掌握後它將成為
你的得力工具。任何在提示符下能鍵入的命令也能放到一個可執行的shell程序裡,這意味著用shell語言能簡單地重
復執行某一任務。
三,shell 如何啟動
shell在你成功地登錄進入系統後啟動,並始終作為你與系統內核的交互手段直至你退出系統。你系統上的
每位用戶都有一個缺省的shell。每個用戶的缺省shell在系統裡的passwd文件裡被指定,該文件的路徑是/etc/passwd。
passwd文件裡還包含有其他東西:每個人的用戶ID號,一個口令加密後的拷貝和用戶登錄後立即執行的程序,(注:
為了加強安全性,現在的系統一般都把加密的口令放在另一個文件--shadow中,而passwd中存放口令的部分以一個x字
符代替)雖然沒有嚴格規定這個程序必須是某個Linux shell,但大多數情況下都如此。
四,最常用的shell
在Linux 和 UNIX系統裡可以使用多種不同的shell可以使用。最常用的幾種是Bourne shell (sh), C shell
(csh), 和 Korn shell (ksh)。三種shell 都有它們的優點和缺點。
1,Bourne shell 的作者是 Steven Bourne。它是 UNIX最初使用的shell並且在每種UNIX上都可以使用。
Bourne shell 在 shell編程方面相當優秀,但在處理與用戶的交互方面作得不如其他幾種 shell。
2,C shell 由 BillJoy所寫,它更多的考慮了用戶界面的友好性。它支持象命令補齊(command-line
completion)等一些 Bourne shell 所不支持的特性。普遍認為C shell 的編程接口做的不如 Bourne shell, 但
C shell 被很多C程序員使用因為C shell的語法和C語言的很相似,這也是Cshell名稱的由來。
3,Korn shell (ksh) 由 Dave Korn 所寫。它集合了C shell 和 Bourne shell的優點並且和 Bourne
shell 完全兼容。
除了這些 shell 以外,許多其他的 shell 程序吸收了這些原來的 shell程序的優點而成為新的 shell 。
在 Linux 上常見的有 tcsh (csh 的擴展),Bourne Again shell(bash, sh 的 擴展),和Public Domain Korn
shell (pdksh, ksh 的擴展)。
bash 是大多數Linux 系統的缺省 shell。Bourne Again shell (bash), 正如它的名字所暗示的,是
Bourne shell 的擴展。bash 與Bourne shell 完全向後兼容,並且在 Bourne shell 的基礎上增加和增強了很多
特性。bash 也包含了很多 C 和 Korn shell 裡的優點。bash 有很靈活和強大的編程接口,同時又有很友好的用戶
界面。
五, 缺省 shell--bash
為什麼要用 bash 來代替 sh 呢?Bourne shell最大的缺點在於它處理用戶的輸入方面。在 Bourne
shell裡鍵入命令會很麻煩,尤其當你鍵入很多相似的命令時。而bash准備了幾種特性使命令的輸入變得更容易。
1,命令補齊(Command-Line Completion)
通常你在 bash (或任何其他的shell)下輸入命令時你不必把命令輸全shell就能判斷出你所要輸入的命
令。例如,假定當前的工作目錄包含以下的文件和子目錄:
News/ bin/ games/ mail/ samplefile/ test/
如果你要進入 test 子目錄,你將會輸入以下的命令:
cd test
這個命令能夠滿足你的需要,但bash還提供了稍微不同的方法來完成同樣的事。因為 test 是當前目錄裡
唯一以字母t開頭的子目錄,bash在你只輸入字母 t後就能判斷出你要做什麼了:
cd t
在你鍵入那個字母後,唯一的可能就是 test 。想讓bash幫你結束命令的話,按下 Tab 鍵:
cd t
當你這樣做以後,bash將幫你補齊命令並顯示在屏幕上。但在你按下回車鍵以前命令並沒有被執行,bash
會讓你檢驗補齊的命令是否是你真正需要的。在輸入象這樣短的命令時你也許看不出它的價值所在,甚至在命令很
短時還會簡慢輸入的速度,但是當你要輸入的命令有點長時,你會發現這個特性是多麼的美好。 但是當目錄裡有不
止一個以字母 t開頭的文件時會發生什麼情況呢?在你使用命令補齊時會有問題,讓我們看看下面的情況,當前目
錄裡有下列內容:
News/ bin/ mail/ samplefile test/ tools/ working/
現在這個目錄裡有兩個以字母 t 開頭的文件。假設你仍然想進入test子目錄,如何使用命令補齊呢?如果
你象先前那樣鍵入:
cd t
bash將不知道你到底想進入哪個子目錄,因為給出的信息並不唯一。如果你這樣做了的話,bash 將發出一
聲蜂鳴 提醒你沒有足夠的信息來補齊你的命令。蜂鳴之後bash並不改變輸入的命令,這將使你能在原來的基礎上再
輸入更多的信息,在這個例子中你僅需再鍵入一個 e 並再按一下 Tab 鍵,這時 bash就有足夠的信息來完成你的命
令了:
cd test
當你輸入命令時不論何時按下 Tab 鍵,bash都將盡其所能地試圖補齊命令,不行的話會發出蜂鳴來提醒你
需要更多的信息。你需要鍵入更多的字符,並再次按下 Tab鍵,重復這個過程直至你期望的命令出現。
2,通配符
另一個使命令輸入變得更簡單的方法是在命令中使用通配符。bash支持三種通配符:
* 匹配任何字符和任何數目的字符
? 匹配任何單字符
[...] 匹配任何包含在括號裡的單字符
* 通配符的使用有些象命令補齊。例如,假設當前目錄包含以下文件:
News/ bin/ games/ mail/ samplefile/ test/
如果你想進入 test 目錄,你將鍵入 cd test, 或者你想用命令補齊:
cd t
現在有第三種方法來做同樣的事。因為僅有一個文件以字母 t 開頭,你也能用 *通配符來進入該目錄。鍵
入下列命令:
cd t*
* 匹配任何字符和任何數目的字符,所以 shell 將把 t* 替換為test(當前目錄裡唯一和通配方案匹配的
文件)。 當前目錄裡只有一個文件以字母 t開頭的話這將是可靠的。但是如果當前目錄裡有不止一個文件以字母 t
開頭, shell將試著進入第一個符合匹配方案的目錄,這個目錄是以字母表排序的第一個目錄,這個目錄也許是也許
不是你所期望的。
通配符 *的一個更實際的用途是通配你要執行的命令中的多個名字相似的文件。例如,假設當前目錄裡包含
以下文件:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/
如果你需要打印所有擴展名是 .doc 的文件,你能使用象這樣簡化的命令:
lpr *.doc
在這個例子中,bash 將把 *.doc替換為當前目錄下所有文件名符合通配方案的文件。在 bash 進行了替換
後,該命令將被處理為:
lpr ch1.doc ch2.doc ch3.doc
lpr 命令將以ch1.doc, ch2.doc, 和 ch3.doc為參數被調用。
通配符 ? 除了只能匹配單個字符外,其他功能都與通配符 *相同,如果用通配符? 來打印前面提到的那個
目錄裡所 有擴展名是 .doc的文件的話,鍵入下面的命令:
lpr ch?.doc
通配符[...]能匹配括號中給出的字符或字符范圍。同樣以前面的目錄為例,打印那個目錄裡所有擴展名是
.doc 的文件,你可以鍵入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc
lpr ch?.doc
通配符[...]能匹配括號中給出的字符或字符范圍。同樣以前面的目錄為例,打印那個目錄裡所有擴展名是
.doc 的文件,你可以鍵入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc