各種作業系統都有它自己的 shell,以 DOS 為例,它的 shell 就是 command.com 檔。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解譯程式可以取代標準的 command.com ,UNIX 下除了 Bourne shell(/bin/sh) 外還有 C shell(/bin/csh)、Korn shell(/bin/ksh)、Bourne again shell(/bin/bash)、Tenex C shell(tcsh) … 等其它的 shell。UNIX/Linux 將 shell 獨立於核心程式之外,使得它就如同一般的應用程式,可以在不影響作業系統本身的情況下進行修改、更新版本或是添加新的功能。
當您簽入(login)時,一個交談式的shell 會跟著起動,並提示您輸入命令。在您鍵入一個命令後,接著就是 shell 的工作了,它會進行:
當您剛開始學UNIX/Linux系統時,您大部份的時間會花在於提示符號(prompt)下執行命令。
如果您經常會輸入一組相同形式的命令,您可能會想要自動執行那些工作。如此,您可以將一些命令放入一個檔案(稱為命令檔,script),然後執行該檔。一個shell 命令檔很像是 DOS 下的批次檔(如 Autoexec.bat):它把一連串的 UNIX 命令存入一個檔案,然後執行該檔。較成熟的命令檔還支援若干現代程式語言的控制結構,譬如說能做條件判斷、迴圈、檔案測試、傳送參數等。要寫著寫命令檔,不僅要學習程式設計的結構和技巧,而且對 UNIX/Linux 公用程式及如何運作需有深入的了解。有些公用程式的功能非常強大(例如 grep、sed 和awk),它們常被用於命令檔來操控命令輸出和檔案。在您對那些工具和程式設計結構變得熟悉之後,您就可以開始寫命令檔。當由命令檔執行命令時,此刻,您就已經把 shell 當做程式語言使用了。
C shell 是在加州大學柏克來分校於70年代末期發展而成,而以2BSD UNIX的部分發行。這個 shell 主要是由 Bill Joy 寫成,提供了一些在標準 Bourne shell 所看不到的額外特色。C shell 是以C 程式語言作為基礎,且它被用來當程式語言時,能共享類似的語法。它也提供在交談式運用上的改進,例如命令列歷程、別名和工作控制。因為 C shell 是在大型機器上設計出來,且增加了一些額外功能,所以 C shell 有在小型機器上跑得較慢,即使在大型機器上跟 Bourne shell 比起來也顯得緩慢。
有了 Bourne shell 和 C shell 之後,UNIX 使用者就有了選擇,且爭論那一個 shell 較好。AT&T 的David Korn 在 80 年代中期發明了 Korn shell,在 1986 年發行且在 1988 年成為正式的部分 SVR4 UNIX。Korn shell 實際上是 Bourne shell 的超集合,且不只可在 UNIX 系統上執行,同時也可在 OS/2、VMS、和 DOS上執行。它提供了和 Bourne shell 向上相容的能力,且增加了許多在 C shell 上受歡迎的特色,更增加了速度和效率。 Korn shell 已歷經許多修正版,要找尋您使用的是那一個版本可在 ksh 提示符號下按 Ctrl-v 鍵。
Bourne shell 是標準的 UNIX shell,以前常被用來做為管理系統之用。大部份的系統管理命令檔,例如 rc start、stop 與shutdown 都是Bourne shell 的命令檔,且在單一使用者模式(single user mode)下以 root 簽入時它常被系統管理者使用。Bourne shell 是由 AT&T 發展的,以簡潔、快速著名。 Bourne shell 提示符號的預設值是 $。
C shell 是柏克萊大學(Berkeley)所開發的,且加入了一些新特性,如命令列歷程(history)、別名(alias)、內建算術、檔名完成(filename completion)、和工作控制(job control)。對於常在交談模式下執行 shell 的使用者而言,他們較喜愛使用 C shell;但對於系統管理者而言,則較偏好以 Bourne shell 來做命令檔,因為 Bourne shell 命令檔比 C shell 命令檔來的簡單及快速。C shell 提示符號的預設值是 %。
Korn shell 是Bourne shell 的超集合(superset),由 AT&T 的 David Korn 所開發。它增加了一些特色,比 C shell 更為先進。Korn shell 的特色包括了可編輯的歷程、別名、函式、正規表達式萬用字元(regular expression wildcard)、內建算術、工作控制(job control)、共作處理(coprocessing)、和特殊的除錯功能。Bourne shell 幾乎和 Korn shell 完全向上相容(upward compatible),所以在 Bourne shell 下開發的程式仍能在 Korn shell 上執行。Korn shell 提示符號的預設值也是 $。在 Linux 系統使用的 Korn shell 叫做 pdksh,它是指 Public Domain Korn Shell。
除了執行效率稍差外,Korn shell 在許多方面都比 Bourne shell 為佳;但是,若將 Korn shell 與 C shell 相比就很困難,因為二者在許多方面都各有所長,就效率和容易使用上看,Korn shell 是優於 C shell,相信許多使用者對於 C Shell 的執行效率都有負面的印象。
在shell 的語法方面,Korn shell 是比較接近一般程式語言,而且它具有副程式的功能及提供較多的資料型態。至於 Bourne shell,它所擁有的資料型態是三種 shell 中最少的,僅提供字串變數和布林型態。在整體考量下 Korn shell 是三者中表現最佳者,其次為 C shell,最後才是 Bourne shell,但是在實際使用中仍有其它應列入考慮的因素,如速度是最重要的選擇時,很可能應該採用 Bourne shell,因它是最基本的 shell,執行的速度最快。
tcsh 是近幾年崛起的一個免費軟體(Linux 下的C shell 其實就是使用 tcsh)執行,它雖然不是UNIX 的標準配備,但是從許多地方您都可以下載到它。如果您是 C shell 的擁護者,筆者建議不妨試試 tcsh,因為您至少可以將它當作是 C shell 來使用。如果您願意花點時間學習,您還可以享受許多它新增的優越功能,例如:
bash 對 Bourne shell 是向下相容(backward compatible),並融入許多C shell 與Korn shell 的功能。這些功能其實 C shell(當然也包括了tcsh)都有,只是過去 Bourne shell 都未支援。以下筆者將介紹 bash 六點重要的改進(詳細的使用說明筆者會在以後的章節介紹):
bash 與tcsh 一樣可以從許多網站上免費下載,它們的性質也十分類似,都是整合其前一代的產品然後增添新的功能,這些新增的功能主要都著重在強化 shell 的程式設計能力以及讓使用者能夠自行定義自己偏好的作業環境。除了上述的五種 shell 之外,zsh 也是一個廣為UNIX 程式設計人員與進階使用者所採用的 shell,zsh 基本上也是 Bourne shell 功能的擴充。
不論是哪一種Shell,它最主要的功用都是解譯使用者在命令列提示符號下輸入的指令。Shell 語法分析命令列,把它分解成以空白區分開的符號(token),在此空白包括了跳位鍵(tab)、空白和換行(New Line)。如果這些字包含了metacharacter,shell 將會評估(evaluate)它們的正確用法。另外,shell 還管理檔案輸入輸出及幕後處理(background processing)。在處理命令列之後,shell 會尋找命令並開始執行它們。
Shell 的另一個重要功用是提供個人化的使用者環境,這通常在 shell 的初始化檔案中完成(.profile、.login、.cshrc、.tcshrc 等等)。這些檔案包括了設定終端機鍵盤和定義視窗的特徵;設定變數,定義搜尋路徑、許可權限、提示符號和終端機類形;以及設定特殊應用程式所需要的變數,例如視窗、文字處理程式、及程式語言的程式庫。Korn shell 和 C shell 加強了個別化的能力:增加歷程、別名、和內建變數集以避免使用者誤殺檔案、不慎簽出、並在當工作完成時通知使用者。
Shell 也能當解譯性的程式語言(interpreted programing language)。Shell 程式,通常叫做命令檔,它由列在檔案內的命令所構成。此程式在編輯器中編輯(雖然也可以直接在命令列下寫作程式, online scripting),由 UNIX 命令和基本的程式結構,例如變數的指定、測試條件、和迴圈所構成。您不需要編譯 shell 命令檔。Shell 本身會解譯命令檔中的每一行,就如同由鍵盤輸入一樣。shell 負責解譯命令,而使用者則必須了解這些命令能做什麼。這本書的索引列出了一些有用的命令和它們的使用方法。
為了確保任何提示符號下輸入的命令都能夠適當地執行。shell 擔任的工作包括有: