歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

什麼是Shell?

  介紹 你可以做許多事情而不必知道它們實際上如何運作。比如,你不必懂得發動機燃燒的物理原理就可以開汽車。缺乏電子知識也不會阻止 你用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無法 顯示文件名。 管道連接    管道是輸入輸出重定向的特例,它將一個命令的輸出直接連到另一個命令的輸入,因此管道也是在調用程序前建立的。考慮下面的命 令行: $whowc -l 5 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編程 當login程序調用你的shell時,shell對你的環境進行設置,其中包括你的home(家)目錄,你使用的終端類型以及用來搜索可執行文件的 路徑。環境被存儲在環境變量中。舉個例子,要改變終端類型,你需要改變TERM變量中的值,就象下面所示的: $echo $TERM vt 100 $TERM=ansi $echo $TERM ansi 注意在C-shell中,給環境變量賦值使用setenv命令。 %setenv TERM vt100 shell編程
Copyright © Linux教程網 All Rights Reserved