Shell簡介及基礎(chǔ)知識(shí)

Shell

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

各種操作系統(tǒng)都有它自己的Shell,以 DOS 為例,它的 shell 就是  command.com 檔。如同 DOS 下有 NDOS,4DOS,DRDOS 等不同的命令解譯程序可以取代標(biāo)準(zhǔn)的 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 獨(dú)立于核心程序之外,使得它就如同一般的應(yīng)用程序,可以在不影響操作系統(tǒng)本身的情況下進(jìn)行修改、更新版本或是添加新的功能。

Shell 的激活

在系統(tǒng)起動(dòng)的時(shí)候,核心程序會(huì)被加載內(nèi)存,負(fù)責(zé)管理系統(tǒng)的工作,直到系統(tǒng)關(guān)閉為止。它建立并控制著處理程序,管理內(nèi)存、檔案系統(tǒng)、通訊等等。而其它的程序,包括 shell 程序,都存放在磁盤中。核心程序?qū)⑺鼈兗虞d內(nèi)存,執(zhí)行它們,并且在它們中止后清理系統(tǒng)。Shell 是一個(gè)公用程序,它在您簽入時(shí)起動(dòng)。藉由解譯使用者輸入的命令(由命令列或命令檔), Shell 提供使用者和核心程序產(chǎn)生交談的功能。

當(dāng)您簽入(login)時(shí),一個(gè)交談式的shell 會(huì)跟著起動(dòng),并提示您輸入命令。在您鍵入一個(gè)命令后,接著就是 shell 的工作了,它會(huì)進(jìn)行:  

1. 語法分析命令列

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

3. 搜尋并執(zhí)行命令

當(dāng)您剛開始學(xué)UNIX/Linux系統(tǒng)時(shí),您大部份的時(shí)間會(huì)花在于提示符號(hào)(prompt)下執(zhí)行命令。

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

Shell 的發(fā)展歷史

第一個(gè)有重要意 義的,標(biāo)準(zhǔn)的 UNIX shell 是V7(AT&T的第七版)UNIX,在1979 年底被提出,且以它的創(chuàng)造者  Stephen Bourne 來命名。Bourne shell 是以 Algol 這種語言為基礎(chǔ)來設(shè)計(jì),主要被用來做自動(dòng)化系統(tǒng)管理工作。雖然  Bourne shell 以簡單和速度而受歡迎,但它缺少許多交談性使用的特色,例如歷程、別名和工作控制。

C shell  是在加州大學(xué)柏克來分校于70年代末期發(fā)展而成,而以2BSD UNIX的部分發(fā)行。這個(gè) shell 主要是由 Bill Joy 寫成,提供了一些在標(biāo)準(zhǔn) Bourne shell 所看不到的額外特色。C shell 是以C 程序語言作為基礎(chǔ),且它被用來當(dāng)程序語言時(shí),能共享類似的語法。它也提供在交談式運(yùn)用上的改進(jìn),例如命令列歷程、別名和工作控制。因?yàn)?C shell 是在大型機(jī)器上設(shè)計(jì)出來,且增加了一些額外功能,所以 C shell  有在小型機(jī)器上跑得較慢,即使在大型機(jī)器上跟 Bourne shell 比起來也顯得緩慢。

有了  Bourne shell 和 C shell 之后,UNIX 使用者就有了選擇,且爭論那一個(gè) shell 較好。AT&T 的 David Korn 在 80 年代中期發(fā)明了 Korn shell,在 1986 年發(fā)行且在 1988 年成為正式的部分 SVR4 UNIX。 Korn shell 實(shí)際上是 Bourne shell 的超集,且不只可在 UNIX 系統(tǒng)上執(zhí)行,同時(shí)也可在 OS/2、VMS、和 DOS上執(zhí)行。它提供了和 Bourne shell 向上兼容的能力,且增加了許多在 C shell 上受歡迎的特色,更增加了速度和效率。  Korn shell 已歷經(jīng)許多修正版,要找尋您使用的是那一個(gè)版本可在 ksh 提示符號(hào)下按 Ctrl-v 鍵。

三種主要的 Shell 與其分支

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

Bourne shell 是標(biāo)準(zhǔn)的 UNIX shell,以前常被用來做為管理系統(tǒng)之用。大部份的系統(tǒng)管理命令文件,例如 rc start、stop 與shutdown 都是Bourne shell 的命令檔,且在單一使用者模式(single user mode)下以 root 簽入時(shí)它常被系統(tǒng)管理者使用。Bourne shell 是由 AT&T 發(fā)展的,以簡潔、快速著名。 Bourne shell 提示符號(hào)的默認(rèn)值是 $。

C shell  是柏克萊大學(xué)(Berkeley)所開發(fā)的,且加入了一些新特性,如命令列歷程(history)、別名(alias)、內(nèi)建算術(shù)、檔名完成(filename completion)、和工作控制(job control)。對于常在交談模式下執(zhí)行 shell 的使用者而言,他們較喜愛使用 C shell;但對于系統(tǒng)管理者而言,則較偏好以 Bourne shell 來做命令檔,因?yàn)?Bourne shell 命令檔比  C shell 命令檔來的簡單及快速。C shell 提示符號(hào)的默認(rèn)值是 %。

Korn shell 是 Bourne shell 的超集(superset),由 AT&T 的 David Korn 所開發(fā)。它增加了一些特色,比  C shell 更為先進(jìn)。Korn shell 的特色包括了可編輯的歷程、別名、函式、正規(guī)表達(dá)式萬用字符(regular expression wildcard)、內(nèi)建算術(shù)、工作控制(job control)、共作處理(coprocessing)、和特殊的除錯(cuò)功能。Bourne shell 幾乎和 Korn shell 完全向上兼容(upward compatible),所以在  Bourne shell 下開發(fā)的程序仍能在 Korn shell 上執(zhí)行。Korn shell 提示符號(hào)的默認(rèn)值也是 $。在 Linux 系統(tǒng)使用的 Korn shell 叫做 pdksh,它是指 Public Domain Korn Shell。

除了執(zhí)行效率稍差外,Korn shell 在許多方面都比 Bourne shell 為佳;但是,若將 Korn shell 與 C shell 相比就很困難,因?yàn)槎咴谠S多方面都各有所長,就效率和容易使用上看,Korn shell 是優(yōu)于 C shell,相信許多使用者對于 C Shell 的執(zhí)行效率都有負(fù)面的印象。

在shell 的語法方面,Korn shell 是比較接近一般程序語言,而且它具有子程序的功能及提供較多的資料型態(tài)。至于 Bourne shell,它所擁有的資料型態(tài)是三種 shell 中最少的,僅提供字符串變量和布爾型態(tài)。在整體考量下  Korn shell 是三者中表現(xiàn)最佳者,其次為 C shell,最后才是 Bourne shell,但是在實(shí)際使用中仍有其它應(yīng)列入考慮的因素,如速度是最重要的選擇時(shí),很可能應(yīng)該采用 Bourne shell,因它是最基本的 shell,執(zhí)行的速度最快。

tcsh 是近幾年崛起的一個(gè)免費(fèi)軟件(Linux 下的C shell 其實(shí)就是使用 tcsh)執(zhí)行,它雖然不是UNIX 的標(biāo)準(zhǔn)配備,但是從許多地方您都可以下載到它。如果您是 C shell 的擁護(hù)者,筆者建議不妨試試 tcsh,因?yàn)槟辽倏梢詫⑺?dāng)作是 C shell 來使用。如果您愿意花點(diǎn)時(shí)間學(xué)習(xí),您還可以享受許多它新增的優(yōu)越功能,例如:  

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

2. 提供了命令列補(bǔ)全功能。  

3. 提供了拼字更正功能。它能夠自動(dòng)檢測并且更正在命令列拼錯(cuò)的命令或是單字。  

4. 危險(xiǎn)命令偵測并提醒的功能,避免您一個(gè)不小心執(zhí)行了rm* 這種殺傷力極大的命令。  

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

bash  對 Bourne shell 是向下兼容(backward compatible),并融入許多C shell 與Korn shell 的功能。這些功能其實(shí) C shell(當(dāng)然也包括了tcsh)都有,只是過去 Bourne shell 都未支持。以下筆者將介紹 bash 六點(diǎn)重要的改進(jìn):

1. 工作控制(job contorl)。bash 支持了關(guān)于工作的訊號(hào)與指令,本章稍后會(huì)提及。

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

3. 命令歷程(command history)。

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

這些命令在技術(shù)上每個(gè)都稱為一個(gè)事件。事件描述的是一個(gè)已經(jīng)采取的行動(dòng)(已經(jīng)被執(zhí)行的命令)。事件是依照執(zhí)行的順序而編號(hào),越近的事件其編號(hào)碼越大,這些事件都是以它的編號(hào)或命令的開頭字符來辨認(rèn)的。history 工具程序讓您參照一個(gè)先前發(fā)生過的事件,將它放在命令列上并允許您執(zhí)行它。最簡單的方法是用上下鍵一次放一個(gè)歷程事件在您的命令列上;您并不需要先用 history 顯示清單。按一次向上鍵會(huì)將最后一個(gè)歷程事件放在您的命令列上,再按一次會(huì)放入下一個(gè)歷程事件。按向下鍵則會(huì)將前一個(gè)事件放在命令列上。  

4. 命令列編輯程序。

BASH shell  命令列編輯能力是內(nèi)建的,讓您輕松地在執(zhí)行之前修改您輸入的命令。若是您在輸入命令時(shí)拼錯(cuò)了字,您不需重新輸入整個(gè)命令,只需在執(zhí)行命令之前使用編輯功能糾正錯(cuò)誤即可。這尤其適合于使用冗長的路徑名稱當(dāng)作參數(shù)的命令時(shí)。命令列編輯作業(yè)是 Emacs 編輯命令的一部份。您可以用 Ctrl-F 或向右鍵往前移一個(gè)字符,Ctrl-b 或向左鍵往回移一個(gè)字符。Ctrl-d 或DEL 鍵會(huì)刪除光標(biāo)目前所在處的字符。要增加文字的話,您只需要將光標(biāo)移到您要插入文字的地方并鍵入新字符即可。無論何時(shí),您都可以按 ENTER 鍵執(zhí)行命令。 ;

5. 允許使用者自訂按鍵。

6. 提供更豐富的變量型態(tài)、命令與控制結(jié)構(gòu)至 shell 中。  

bash  與tcsh 一樣可以從許多網(wǎng)站上免費(fèi)下載,它們的性質(zhì)也十分類似,都是整合其前一代的產(chǎn)品然后增添新的功能,這些新增的功能主要都著重在強(qiáng)化  shell 的程序設(shè)計(jì)能力以及讓使用者能夠自行定義自己偏好的作業(yè)環(huán)境。除了上述的五種 shell 之外,zsh 也是一個(gè)廣為UNIX 程序設(shè)計(jì)人員與進(jìn)階使用者所采用的 shell,zsh 基本上也是 Bourne shell 功能的擴(kuò)充。

Shell 的使用

不 論是哪一種Shell,它最主要的功用都是解譯使用者在命令列提示符號(hào)下輸入的指令。Shell 語法分析命令列,把它分解成以空白區(qū)分開的符號(hào)(token),在此空白包括了跳位鍵(tab)、空白和換行(New Line)。如果這些字包含了metacharacter,shell 將會(huì)評估(evaluate)它們的正確用法。另外,shell 還管理檔案輸入輸出及幕后處理(background processing)。在處理命令列之后,shell 會(huì)尋找命令并開始執(zhí)行它們。

Shell 的另一個(gè)重要功用是提供個(gè)人化的使用者環(huán)境,這通常在 shell 的初始化檔案中完成(.profile、.login、.cshrc、.tcshrc 等等)。這些檔案包括了設(shè)定終端機(jī)鍵盤和定義窗口的特征;設(shè)定變量,定義搜尋路徑、權(quán)限限、提示符號(hào)和終端機(jī)類形;以及設(shè)定特殊應(yīng)用程序所需要的變量,例如窗口、文字處理程序、及程序語言的鏈接庫。Korn shell 和  C shell 加強(qiáng)了個(gè)別化的能力:增加歷程、別名、和內(nèi)建變量集以避免使用者誤殺檔案、不慎簽出、并在當(dāng)工作完成時(shí)通知使用者。

Shell  也能當(dāng)解譯性的程序語言(interpreted programing language)。Shell 程序,通常叫做命令文件,它由列在檔案內(nèi)的命令所構(gòu)成。此程序在編輯器中編輯(雖然也可以直接在命令列下寫作程序, online scripting),由 UNIX 命令和基本的程序結(jié)構(gòu),例如變量的指定、測試條件、和循環(huán)所構(gòu)成。您不需要編譯 shell 命令檔。Shell 本身會(huì)解譯命令檔中的每一行,就如同由鍵盤輸入一樣。shell  負(fù)責(zé)解譯命令,而使用者則必須了解這些命令能做什么。這本書的索引列出了一些有用的命令和它們的使用方法。

Shell 的功用

為了確保任何提示符號(hào)下輸入的命令都能夠適當(dāng)?shù)貓?zhí)行。shell 擔(dān)任的工作包括有:  

1. 讀取輸入和語法分析命令列  

2. 對特殊字符求值  

3. 設(shè)立管線、轉(zhuǎn)向、和幕后處理  

4. 處理訊號(hào)

5. 設(shè)立程序來執(zhí)行

發(fā)表評論

(required)

This site uses Akismet to reduce spam. Learn how your comment data is processed.