什麼是shell

來源:互聯網
上載者:User

介紹 
你可以做許多事情而不必知道它們實際上如何運作。比如,你不必懂得發動機燃燒的物理原理就可以開汽車。缺乏電子知識也不會阻止 
你用CD機聽音樂。不知道什麼是Shell和它的工作原理,你還是可以使用UNIX。但是,知道這些你可以更好地利用UNIX。 
一個UNIX系統有三種具有代表性的Shell可用:Bourne 
shell,Korn shell,C shells。它們會在11,12,13章討論。在這一章中,你會學到: 

什麼是Shell 
Shell可以為你做什麼 
Shell和整個系統的關係 

核心與Shell 

堅果的殼保護其內部的核,同樣一個UNIX 
shell提供一個外設的保護層。當你啟動一台基於UNIX的電腦時,UNIX的程式被調入電腦的記憶體裡,直到你關機。這個程式叫做內 
核(kernel),它執行許多底級和系統級的工作。核心有責任解釋基本指令並將其送到處理器。核心也負責運行和調度進程,以及執行所 
有的輸入輸出。核心是UNIX系統的心臟,核心有且只有一個。 

你也許對核心職責的關鍵性有點迷惑,而核心指令同樣的複雜和高技術性。為了對使用者屏蔽核心的複雜性,也為了保護核心以免使用者誤操 
作造成損害,在核心的周圍建了一個外殼(shell)。使用者向shell提出請求,shell解釋並將請求傳給核心。這一節剩下的部分解釋這個外層 
是如何建立的。 

一旦核心調入記憶體,他就準備執行使用者的請求。然而,使用者首先得串連登入,然後發出請求。不管怎樣,使用者登入,核心必須知道使用者是 
誰以及如何與他通話。為了做到這點,核心調用兩個特殊的程式,getty和login.對應每個使用者的登入點--通常稱為一個tty--核心調用 
getty程式。這個過程被稱為spawning(spawn原意是產卵)。getty顯示一個登入提示,接著不斷地監視通話點等待使用者名稱的輸入。當 
getty取得任何輸入時,它便調用login程式。login建立使用者的身份並驗證他登入的權利。login程式檢查password(密碼)檔案。如果用 
戶輸入的密碼不正確,控制將從登入點返回到getty。如果正確,login調用password檔案裡使用者條目中所記錄的程式並將控制交給它。這 
個程式也許是一個文書處理軟體或者是試算表程式,不過一般是被稱為shell的程式。 

假設有四個使用者已經登入進系統。這四個使用者中,有兩個正使用Bourne shell,一個使用Korn 
shell,還有一個使用試算表程式。每一個使用者都得到一份shell的拷貝以服務它的請求,但是核心只有一個。使用shell不會阻礙使用者使用 
試算表或別的程式,但那些程式是運行在活動的shell下的。shell是一個單一使用者專用的程式,它在使用者和UNIX核心之間提供了一個界 
面。 

你不必一定要使用shell來存取UNIX。上面的例子中,有個使用者使用試算表取代了shell。當這個使用者登入進來時,試算表程式啟動。 
當它退出試算表程式時,他也就退出了系統。當強調安全性或者希望將使用者與任何UNIX的介面屏蔽開時,這個技術挺有用。缺點是用 
戶不能使用mail或其他UNIX的功能。 

因為login後可以執行任何程式--shell只是簡單的一個程式--你就有可能編寫自己的shell。事實上,三個獨立開發的shell已經成為UNIX 
標準的一部分。它們是: 

Bourne shell,由Stephen Bourne開發 
Korn shell,由David Korn開發 
C shell,由Bill Joy開發 

shell的多樣性使你可以選擇最適合你或者你感到最親近的介面。 

shell的功能 

不過你選擇哪個標準的shell並沒有多大關係,因為三個shell都有相同的目的:在UNIX下為使用者提供一個介面。為了達到這個目標,三個 
shell都提供了相同的準系統: 

命令列解釋功能 
啟動程式 
輸入輸出重新導向 
管道串連 
檔案名稱置換 
變數維護 
環境控制 
shell編程 

命令列解釋 

當你登入進來,啟動一個互動shell時,你會看到一個shell提示,通常是$,%或者#符號的形式。當你在提示符下敲進一行字元後, 
shell就試圖解釋它。shell提示符下的輸入有時被稱為一個命令列。命令列的基本格式是 
command arguments 
命令名 參數(一個或多個)) 

command(命令)是可執行檔UNIX命令,程式,工具 + 生產力,或shell程式。arguments(參數)被傳遞給執行程式。大多數的UNIX實 
用程式要求參數有以下的格式: 
option filenames 
選項 檔案名稱(一個或多個)) 

舉個例子,在命令列下有 

$ ls -l 
file1 file2 

在這個命令列中有三個參數傳遞給ls,第一個是個選項,剩下的兩個是檔案名稱。shell為核心所做的事情之一是減少不需要的資訊。對於計 
算機,空白(whit-espace)是一類無用資訊;因此,有必要知道shell在遇到空白時做了些什麼。空白由空格,水平定位字元和分行符號組成。 
考慮這個例子: 

$ echo part A part B part C 

part A part B part C 

這兒將命令列解釋為有六個參數的echo命令並刪除了參數之間的空白。假設如果你正在列印報告頭想保留空白,你就得用引號將資料括起 
來就象下面所示: 

$echo part A part B part C 

part A part B part C 

單引號阻止shell檢查引號裡面。現在shell將這一行解釋為帶一個參數的echo命令,而這個參數正好是包含空白的字串。 

  

啟動程式 

當shell解釋完命令列後,它就啟動命令列中要求的程式。實際是核心執行這個程式。為了啟動程式執行,shell在PATH環境變數指定的目 
錄中搜尋可執行檔。當它找到這個檔案,就啟動一個子shell來運行程式。你應該知道子shell不必影響它父親的環境設定而建立和操縱自 
己的環境。比如一個子shell可以改變它的工作目錄,當它運行完後,其父shell的工作目錄仍保持不變。 

  

輸入輸出重新導向 

shell在執行程式前進行重新導向。考慮下面兩個例子,其中使用wc單詞統計工具統計有五行的資料檔案: 

$wc -l fivelines 

5 fivelines 

$wc -l 5 

這裡有一點微小的差異。在第一個例子中,wc知道它應該出去尋找名為fivelines的檔案並對其進行操作。因為wc知道檔案名稱,所以它將其 
顯示給使用者。在第二個例子中,wc僅看到資料而不知道這些資料從那裡來,因為shell做了定位和重新導向資料到wc的工作,也因此wc無法 
顯示檔案名稱。 

  

管道串連 

  管道是輸入輸出重新導向的特例,它將一個命令的輸出直接連到另一個命令的輸入,因此管道也是在調用程式前建立的。考慮下面的命 
令行: 

$who|wc -l 

shell沒將who的輸出顯示到螢幕上,而是定向到wc的輸入。 

  

檔案名稱置換 

  

shell有責任進行檔案名稱的替換。shell在執行程式前做替換。舉個例子: 

$echo 

file1 file2 file3 file3x file4 

這兒,星號被擴充為五個檔案名稱,並被傳遞給echo作為五個參數。如果你想顯示一個星號,你應該用引號將它括起來。 

    

變數維護 

   

shell有能力進行變數維護。變數是儲存資料為將來所用的場所。用等號(=)可以給變數賦值。 

$LOOKUP=/usr/mydir 

在這裡,shell建立一個LOOKUP變數,並將/usr/mydir賦給它。稍後,你可以在命令列上通過在變數名之前加$符號來使用變數值。考慮 
這些例子: 

$echo $LOOKUP 

/usr/mydir 

$echo LOOKUP 

LOOKUP 

C-shell的使用者應該注意:C-shell中的賦值不同於Bourne和Korn 
shell。C-shell使用set命令進行賦值。 

$set LOOKUP = 
/usr/mydir 

注意在等號兩邊要加空格。 

就象檔案名稱的置換一樣,變數名的置換也是在調用程式前進行。第二個例子省略了$符號。因此,shell只是簡單地將字串傳遞給echo作 
參數。在變數替換中,變數的值取代了變數名。例如在: 

$ls $LOOKUP/filename 

用/usr/mydir/filename做參數調用ls。   

環境控制 

當login程式調用你的shell時,shell對你的環境進行設定,其中包括你的home(家)目錄,你使用的終端類型以及用來搜尋可執行檔的 
路徑。環境被儲存在環境變數中。舉個例子,要改變終端類型,你需要改變TERM變數中的值,就象下面所示的: 

$echo $TERM 

vt 100 

$TERM=ansi 

$echo $TERM 

ansi 

注意在C-shell中,給環境變數賦值使用setenv命令。 

%setenv TERM 
vt100 

shell編程 

  

你已經看到shell可以用來解釋命令列,維護變數,執行程式。另外shell還是一種程式設計語言。通過使用流程式控制制和條件判斷來組合命令與變 
量賦值,你就擁有了一個有力的編程工具。使用shell作為一門程式設計語言,你可以使重複的任務自動化,寫報告,甚至你可以建立和操縱自 
己的資料檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.