歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux操作系統的Shell簡介及其分類

Linux操作系統的Shell簡介及其分類

日期:2017/3/3 16:42:47   编辑:關於Linux

什麼是shell?

Shell是一種具備特殊功能的程序,它是介於使用者和UNIX/Linux 操作系統之核心程序(kernel)間的一個接口。為什麼我們說 shell是一種介於系統核心程序與使用者間的中介者呢?讀過操作系統概論的讀者們都知道操作系統是一個系統資源的管理者與分配者,當您有需求時,您得向系統提出;從操作系統的角度來看,它也必須防止使用者因為錯誤的操作而造成系統的傷害?眾所周知,對計算機下命令得透過命令(command)或是程序(program);程序有編譯器(compiler)將程序轉為二進制代碼,可是命令呢?其實shell也是一支程序,它由輸入設備讀取命令,再將其轉為計算機可以了解的機械碼,然後執行它。

各種操作系統都有它自己的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獨立於核心程序之外,使得它就如同一般的應用程序,可以在不影響操作系統本身的情況下進行修改、更新版本或是添加新的功能。

shell的激活

在系統起動的時候,核心程序會被加載內存,負責管理系統的工作,直到系統關閉為止。它建立並控制著處理程序,管理內存、檔案系統、通訊等等。而其它的程序,包括 shell程序,都存放在磁盤中。核心程序將它們加載內存,執行它們,並且在它們中止後清理系統。shell是一個公用程序,它在您簽入時起動。藉由解譯使用者輸入的命令(由命令列或命令檔),shell提供使用者和核心程序產生交談的功能。

當您簽入(login)時,一個交談式的shell會跟著起動,並提示您輸入命令。在您鍵入一個命令後,接著就是shell的工作了,它會進行:

1.語法分析命令列。

2.處理萬用字符(wildcards)、轉向(redirection)、管線(pipes)與工作控制(job control)。

3.搜尋並執行命令。

當您剛開始學UNIX/Linux系統時,您大部份的時間會花在於提示符號(prompt)下執行命令。

如果您經常會輸入一組相同形式的命令,您可能會想要自動執行那些工作。如此,您可以將一些命令放入一個檔案(稱為命令檔,script),然後執行該檔。一個shell命令檔很像是DOS下的批次檔(如 Autoexec.bat):它把一連串的UNIX 命令存入一個檔案,然後執行該檔。較成熟的命令檔還支持若干現代程序語言的控制結構,譬如說能做條件判斷、循環、檔案測試、傳送參數等。要寫著寫命令檔,不僅要學習程序設計的結構和技巧,而且對 UNIX/Linux 公用程序及如何運作需有深入的了解。有些公用程序的功能非常強大(例如 grep、sed 和awk),它們常被用於命令檔來操控命令輸出和檔案。在您對那些工具和程序設計結構變得熟悉之後,您就可以開始寫命令檔。當由命令檔執行命令時,此刻,您就已經把 shell當做程序語言使用了。

細說 shell的生平

第一個有重要意義的,標准的UNIX shell是V7(AT&T的第七版)UNIX,在1979 年底被提出,且以它的創造者 Stephen Bourne 來命名。Bourne shell是以Algol 這種語言為基礎來設計,主要被用來做自動化系統管理工作。雖然 Bourne 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 鍵。

三種主要的shell與其分身

在大部份的UNIX系統,三種著名且廣被支持的shell是Bourne shell(AT&T shell,在Linux下是BASH)、C shell(Berkeley shell,在Linux下是TCSH)和Korn shell(Bourne shell的超集)。這三種 shell在交談(interactive)模式下的表現相當類似,但作為命令文件語言時,在語法和執行效率上就有些不同了。

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來使用。如果您願意花點時間學習,您還可以享受許多它新增的優越功能,例如:

1.tcsh 提供了一個命令列(command line)編輯程序。

2.提供了命令列補全功能。

3.提供了拼字更正功能。它能夠自動檢測並且更正在命令列拼錯的命令或是單字。

4.危險命令偵測並提醒的功能,避免您一個不小心執行了rm* 這種殺傷力極大的命令。

5.提供常用命令的快捷方式(shortcut)。

bash對Bourne shell是向下兼容(backward compatible),並融入許多C shell與Korn shell的功能。這些功能其實C shell(當然也包括了tcsh)都有,只是過去 Bourne shell都未支持。以下筆者將介紹 bash 六點重要的改進(詳細的使用說明筆者會在以後的章節介紹):

1.工作控制(job contorl)。bash 支持了關於工作的訊號與指令,本章稍後會提及。

2.別名功能(aliases)。alias 命令是用來為一個命令建立另一個名稱,它的運作就像一個宏,展開成為它所代表的命令。別名並不會替代掉命令的名稱,它只是賦予那個命令另一個名字。

3.命令歷程(command history)。BASH shell加入了C shell所提供的命令歷程功能,它以history工具程序記錄了最近您執行過的命令。命令是由1開始編號,默認值為500。history工具程序是一種短期記憶,記錄您最近所執行的命令。要看看這些命令,您可以在命令列鍵入 history,如此將會顯示最近執行過之命令的清單,並在前方加上編號。

這些命令在技術上每個都稱為一個事件。事件描述的是一個已經采取的行動(已經被執行的命令)。事件是依照執行的順序而編號,越近的事件其編號碼越大,這些事件都是以它的編號或命令的開頭字符來辨認的。history工具程序讓您參照一個先前發生過的事件,將它放在命令列上並允許您執行它。最簡單的方法是用上下鍵一次放一個歷程事件在您的命令列上;您並不需要先用 history 顯示清單。按一次向上鍵會將最後一個歷程事件放在您的命令列上,再按一次會放入下一個歷程事件。按向下鍵則會將前一個事件放在命令列上。

Copyright © Linux教程網 All Rights Reserved