shell是用戶和linux操作系統(tǒng)之間的接口。linux中有多種shell,其中缺省使用的是bash。本章講述了shell的工作原理,shell的種類,shell的一般操作及bash的特性。
什么是shell
linux系統(tǒng)的shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口。它是命令語言、命令解釋程序及程序設(shè)計(jì)語言的統(tǒng)稱。
shell是用戶和linux內(nèi)核之間的接口程序,如果把linux內(nèi)核想象成一個(gè)球體的中心,shell就是圍繞內(nèi)核的外層。當(dāng)從shell或其他程序向linux傳遞命令時(shí),內(nèi)核會做出相應(yīng)的反應(yīng)。
shell是一個(gè)命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell也能被系統(tǒng)中其他應(yīng)用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先解釋然后傳給linux核心。
有一些命令,比如改變工作目錄命令cd,是包含在shell內(nèi)部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在于文件系統(tǒng)中某個(gè)目錄下的單獨(dú)的程序。對用戶而言,不必關(guān)心一個(gè)命令是建立在shell內(nèi)部還是一個(gè)單獨(dú)的程序。
shell首先檢查命令是否是內(nèi)部命令,若不是再檢查是否是一個(gè)應(yīng)用程序(這里的應(yīng)用程序可以是linux本身的實(shí)用程序,如ls和rm,也可以是購買的商業(yè)程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里尋找這些應(yīng)用程序(搜索路徑就是一個(gè)能找到可執(zhí)行程序的目錄列表)。如果鍵入的命令不是一個(gè)內(nèi)部命令并且在路徑里沒有找到這個(gè)可執(zhí)行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內(nèi)部命令或應(yīng)用程序?qū)⒈环纸鉃橄到y(tǒng)調(diào)用并傳給linux內(nèi)核。圖10-1展示了shell是如何執(zhí)行命令的。
用戶命令
外部命令
unix核心
圖10-1 shell的工作原理
shell的另一個(gè)重要特性是它自身就是一個(gè)解釋型的程序設(shè)計(jì)語言,shell程序設(shè)計(jì)語言支持絕大多數(shù)在高級語言中能見到的程序元素,如函數(shù)、變量、數(shù)組和程序控制結(jié)構(gòu)。shell編程語言簡單易學(xué),任何在提示符中能鍵入的命令都能放到一個(gè)可執(zhí)行的shell程序中。
當(dāng)普通用戶成功登錄,系統(tǒng)將執(zhí)行一個(gè)稱為shell的程序。正是shell進(jìn)程提供了命令行提示符。作為默認(rèn)值(turbolinux系統(tǒng)默認(rèn)的shell是bash),對普通用戶用“$”作提示符,對超級用戶(root)用“#”作提示符。
一旦出現(xiàn)了shell提示符,就可以鍵入命令名稱及命令所需要的參數(shù)。shell將執(zhí)行這些命令。如果一條命令花費(fèi)了很長的時(shí)間來運(yùn)行,或者在屏幕上產(chǎn)生了大量的輸出,可以從鍵盤上按ctrl+c發(fā)出中斷信號來中斷它(在正常結(jié)束之前,中止它的執(zhí)行)。
當(dāng)用戶準(zhǔn)備結(jié)束登錄對話進(jìn)程時(shí),可以鍵入logout命令、exit命令或文件結(jié)束符(eof)(按ctrl+d實(shí)現(xiàn)),結(jié)束登錄。
我們來實(shí)習(xí)一下shell是如何工作的。
$ make work
make:*no rule to make target ‘work’. stop.
$
注釋:make是系統(tǒng)中一個(gè)命令的名字,后面跟著命令參數(shù)。在接收到這個(gè)命令后,shell便執(zhí)行它。本例中,由于輸入的命令參數(shù)不正確,系統(tǒng)返回信息后停止該命令的執(zhí)行。
在例子中,shell會尋找名為make的程序,并以work為參數(shù)執(zhí)行它。make是一個(gè)經(jīng)常被用來編譯大程序的程序,它以參數(shù)作為目標(biāo)來進(jìn)行編譯。在“make work”中,make編譯的目標(biāo)是work。因?yàn)閙ake找不到以work為名字的目標(biāo),它便給出錯誤信息表示運(yùn)行失敗,用戶又回到系統(tǒng)提示符下。
另外,用戶鍵入有關(guān)命令行后,如果shell找不到以其中的命令名為名字的程序,就會給出錯誤信息。例如,如果用戶鍵入:
$ myprog
bash:myprog:command not found
$
可以看到,用戶得到了一個(gè)沒有找到該命令的錯誤信息。用戶敲錯命令后,系統(tǒng)一般會給出這樣的錯誤信息。
shell的種類
linux中的shell有多種類型,其中最常用的幾種是bourne shell(sh)、c shell(csh)和korn shell(ksh)。三種shell各有優(yōu)缺點(diǎn)。bourne shell是unix最初使用的shell,并且在每種unix上都可以使用。bourne shell在shell編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面做得不如其他幾種shell。linux操作系統(tǒng)缺省的shell是bourne again shell,它是bourne shell的擴(kuò)展,簡稱bash,與bourne shell完全向后兼容,并且在bourne shell的基礎(chǔ)上增加、增強(qiáng)了很多特性。bash放在/bin/bash中,它有許多特色,可以提供如命令補(bǔ)全、命令編輯和命令歷史表等功能,它還包含了很多c shell和korn shell中的優(yōu)點(diǎn),有靈活和強(qiáng)大的編程接口,同時(shí)又有很友好的用戶界面。
c shell是一種比bourne shell更適于編程的shell,它的語法與c語言很相似。 linux為喜歡使用c shell的人提供了tcsh。tcsh是c shell的一個(gè)擴(kuò)展版本。tcsh包括命令行編輯、可編程單詞補(bǔ)全、拼寫校正、歷史命令替換、作業(yè)控制和類似c語言的語法,它不僅和bash shell是提示符兼容,而且還提供比bash shell更多的提示符參數(shù)。
korn shell集合了c shell和bourne shell的優(yōu)點(diǎn)并且和bourne shell完全兼容。linux系統(tǒng)提供了pdksh(ksh的擴(kuò)展),它支持任務(wù)控制,可以在命令行上掛起、后臺執(zhí)行、喚醒或終止程序。
linux并沒有冷落其他shell用戶,還包括了一些流行的shell如ash、zsh等。每個(gè)shell都有它的用途,有些shell是有專利的,有些能從internet網(wǎng)上或其他來源獲得。要決定使用哪個(gè)shell,只需讀一下各種shell的聯(lián)機(jī)幫助,并試用一下。
用戶在登錄到linux時(shí)由/etc/passwd文件來決定要使用哪個(gè)shell。例如:
# fgrep lisa /etc/passwd
lisa:x:500:500:turbolinux user:/home/lisa:/bin/bash
shell被列每行的末尾(/bin/bash)。
由于bash是linux上缺省的shell,本章主要介紹bash及其相關(guān)知識。