- 論壇徽章:
- 0
|
shell 十三問?
關(guān)于第一個問題,什么是shell
作者:Rick Rummel
介紹
你可以做許多事情而不必知道它們實際上如何運作。比如,你不必懂得發(fā)動機燃燒的物理原理就可以開汽車。缺乏電子知識也不會阻止
你用CD機聽音樂。不知道什么是Shell和它的工作原理,你還是可以使用UNIX。但是,知道這些你可以更好地利用UNIX。
一個UNIX系統(tǒng)有三種具有代表性的Shell可用:Bourne
shell,Korn shell,C shells。它們會在11,12,13章討論。在這一章中,你會學到:
什么是Shell
Shell可以為你做什么
Shell和整個系統(tǒng)的關(guān)系
內(nèi)核與Shell
堅果的殼保護其內(nèi)部的核,同樣一個UNIX
shell提供一個外設(shè)的保護層。當你啟動一臺基于UNIX的計算機時,UNIX的程序被調(diào)入計算機的內(nèi)存里,直到你關(guān)機。這個程序叫做內(nèi)
核(kernel),它執(zhí)行許多底級和系統(tǒng)級的工作。內(nèi)核有責任解釋基本指令并將其送到處理器。內(nèi)核也負責運行和調(diào)度進程,以及執(zhí)行所
有的輸入輸出。內(nèi)核是UNIX系統(tǒng)的心臟,內(nèi)核有且只有一個。
你也許對內(nèi)核職責的關(guān)鍵性有點迷惑,而內(nèi)核指令同樣的復(fù)雜和高技術(shù)性。為了對用戶屏蔽內(nèi)核的復(fù)雜性,也為了保護內(nèi)核以免用戶誤操
作造成損害,在內(nèi)核的周圍建了一個外殼(shell)。用戶向shell提出請求,shell解釋并將請求傳給內(nèi)核。這一節(jié)剩下的部分解釋這個外層
是如何建立的。
一旦內(nèi)核調(diào)入內(nèi)存,他就準備執(zhí)行用戶的請求。然而,用戶首先得連接登錄,然后發(fā)出請求。不管怎樣,用戶登錄,內(nèi)核必須知道用戶是
誰以及如何與他通話。為了做到這點,內(nèi)核調(diào)用兩個特殊的程序,getty和login.對應(yīng)每個用戶的登錄點--通常稱為一個tty--內(nèi)核調(diào)用
getty程序。這個過程被稱為spawning(spawn原意是產(chǎn)卵)。getty顯示一個登錄提示,接著不斷地監(jiān)視通話點等待用戶名的輸入。當
getty取得任何輸入時,它便調(diào)用login程序。login建立用戶的身份并驗證他登錄的權(quán)利。login程序檢查password(密碼)文件。如果用
戶輸入的密碼不正確,控制將從登錄點返回到getty。如果正確,login調(diào)用password文件里用戶條目中所記錄的程序并將控制交給它。這
個程序也許是一個字處理軟件或者是電子表格程序,不過一般是被稱為shell的程序。
假設(shè)有四個用戶已經(jīng)登錄進系統(tǒng)。這四個用戶中,有兩個正使用Bourne shell,一個使用Korn
shell,還有一個使用電子表格程序。每一個用戶都得到一份shell的拷貝以服務(wù)它的請求,但是內(nèi)核只有一個。使用shell不會阻礙用戶使用
電子表格或別的程序,但那些程序是運行在活動的shell下的。shell是一個單一用戶專用的程序,它在用戶和UNIX內(nèi)核之間提供了一個界
面。
你不必一定要使用shell來存取UNIX。上面的例子中,有個用戶使用電子表格取代了shell。當這個用戶登錄進來時,電子表格程序啟動。
當它退出電子表格程序時,他也就退出了系統(tǒng)。當強調(diào)安全性或者希望將用戶與任何UNIX的界面屏蔽開時,這個技術(shù)挺有用。缺點是用
戶不能使用mail或其他UNIX的功能。
因為login后可以執(zhí)行任何程序--shell只是簡單的一個程序--你就有可能編寫自己的shell。事實上,三個獨立開發(fā)的shell已經(jīng)成為UNIX
標準的一部分。它們是:
Bourne shell,由Stephen Bourne開發(fā)
Korn shell,由David Korn開發(fā)
C shell,由Bill Joy開發(fā)
shell的多樣性使你可以選擇最適合你或者你感到最親近的界面。
shell的功能
不過你選擇哪個標準的shell并沒有多大關(guān)系,因為三個shell都有相同的目的:在UNIX下為用戶提供一個界面。為了達到這個目標,三個
shell都提供了相同的基本功能:
命令行解釋功能
啟動程序
輸入輸出重定向
管道連接
文件名置換
變量維護
環(huán)境控制
shell編程
命令行解釋
當你登錄進來,啟動一個交互式的shell時,你會看到一個shell提示,通常是$,%或者#符號的形式。當你在提示符下敲進一行字符后,
shell就試圖解釋它。shell提示符下的輸入有時被稱為一個命令行。命令行的基本格式是
command arguments
命令名 參數(shù)(一個或多個))
command(命令)是可執(zhí)行的UNIX命令,程序,實用工具,或shell程序。arguments(參數(shù))被傳遞給執(zhí)行程序。大多數(shù)的UNIX實
用程序要求參數(shù)有以下的格式:
option filenames
選項 文件名(一個或多個))
舉個例子,在命令行下有
$ ls -l
file1 file2
在這個命令行中有三個參數(shù)傳遞給ls,第一個是個選項,剩下的兩個是文件名。shell為內(nèi)核所做的事情之一是減少不需要的信息。對于計
算機,空白(whit-espace)是一類無用信息;因此,有必要知道shell在遇到空白時做了些什么?瞻子煽崭,水平制表符和換行符組成。
考慮這個例子:
$ echo part A part B part C
part A part B part C
這兒將命令行解釋為有六個參數(shù)的echo命令并刪除了參數(shù)之間的空白。假設(shè)如果你正在打印報告頭想保留空白,你就得用引號將數(shù)據(jù)括起
來就象下面所示:
$echo part A part B part C
part A part B part C
單引號阻止shell檢查引號里面,F(xiàn)在shell將這一行解釋為帶一個參數(shù)的echo命令,而這個參數(shù)正好是包含空白的字符串。
啟動程序
當shell解釋完命令行后,它就啟動命令行中要求的程序。實際是內(nèi)核執(zhí)行這個程序。為了啟動程序執(zhí)行,shell在PATH環(huán)境變量指定的目
錄中搜索可執(zhí)行文件。當它找到這個文件,就啟動一個子shell來運行程序。你應(yīng)該知道子shell不必影響它父親的環(huán)境設(shè)置而建立和操縱自
己的環(huán)境。比如一個子shell可以改變它的工作目錄,當它運行完后,其父shell的工作目錄仍保持不變。
輸入輸出重定向
shell在執(zhí)行程序前進行重定向?紤]下面兩個例子,其中使用wc單詞統(tǒng)計工具統(tǒng)計有五行的數(shù)據(jù)文件:
$wc -l fivelines
5 fivelines
$wc -l 5
這里有一點微小的差異。在第一個例子中,wc知道它應(yīng)該出去尋找名為fivelines的文件并對其進行操作。因為wc知道文件名,所以它將其
顯示給用戶。在第二個例子中,wc僅看到數(shù)據(jù)而不知道這些數(shù)據(jù)從那里來,因為shell做了定位和重定向數(shù)據(jù)到wc的工作,也因此wc無法
顯示文件名。
管道連接
管道是輸入輸出重定向的特例,它將一個命令的輸出直接連到另一個命令的輸入,因此管道也是在調(diào)用程序前建立的?紤]下面的命
令行:
$who|wc -l
5
shell沒將who的輸出顯示到屏幕上,而是定向到wc的輸入。
文件名置換
shell有責任進行文件名的替換。shell在執(zhí)行程序前做替換。舉個例子:
$echo
*
file1 file2 file3 file3x file4
這兒,星號被擴展為五個文件名,并被傳遞給echo作為五個參數(shù)。如果你想顯示一個星號,你應(yīng)該用引號將它括起來。
變量維護
shell有能力進行變量維護。變量是存儲數(shù)據(jù)為將來所用的場所。用等號(=)可以給變量賦值。
$LOOKUP=/usr/mydir
在這里,shell建立一個LOOKUP變量,并將/usr/mydir賦給它。稍后,你可以在命令行上通過在變量名之前加$符號來使用變量值?紤]
這些例子:
$echo $LOOKUP
/usr/mydir
$echo LOOKUP
LOOKUP
C-shell的用戶應(yīng)該注意:C-shell中的賦值不同于Bourne和Korn
shell。C-shell使用set命令進行賦值。
$set LOOKUP =
/usr/mydir
注意在等號兩邊要加空格。
就象文件名的置換一樣,變量名的置換也是在調(diào)用程序前進行。第二個例子省略了$符號。因此,shell只是簡單地將字符串傳遞給echo作
參數(shù)。在變量替換中,變量的值取代了變量名。例如在:
$ls $LOOKUP/filename
用/usr/mydir/filename做參數(shù)調(diào)用ls!
環(huán)境控制
當login程序調(diào)用你的shell時,shell對你的環(huán)境進行設(shè)置,其中包括你的home(家)目錄,你使用的終端類型以及用來搜索可執(zhí)行文件的
路徑。環(huán)境被存儲在環(huán)境變量中。舉個例子,要改變終端類型,你需要改變TERM變量中的值,就象下面所示的:
$echo $TERM
vt 100
$TERM=ansi
$echo $TERM
ansi
注意在C-shell中,給環(huán)境變量賦值使用setenv命令。
%setenv TERM
vt100
shell編程
你已經(jīng)看到shell可以用來解釋命令行,維護變量,執(zhí)行程序。另外shell還是一種編程語言。通過使用流程控制和條件判斷來組合命令與變
量賦值,你就擁有了一個有力的編程工具。使用shell作為一門編程語言,你可以使重復(fù)的任務(wù)自動化,寫報告,甚至你可以建立和操縱自
己的數(shù)據(jù)文件。
來源:http://www.linuxeden.com/edu/doctext.php?docid=1337 |
|