命令解釋程式是用戶用來進行作業系統核心和其它命令之間互動的程式。一般的命令解釋程式都具有接受用戶命令的輸入、解釋用戶命令和執行用戶命令的功能。Unix分時作業系統與用戶的界面是命令語言shell(外殼),其解釋程式同樣也被稱為shell,包含有ksh,bash,csh等。
基本介紹
- 中文名:UNIX命令解釋程式
- 外文名:UNIX command interpreter
- 別稱:shell
- 包含:ksh,bash,csh
- 簡介:進行核心和其它命令間互動的程式
- 套用學科:計算機科學、通信工程、系統科學
簡介,定義,基本結構,調用方式,用命令調用,在程式中調用,面向目標的命令解釋程式,命令樹和進程族,
簡介
定義
命令解釋程式,用戶通過它來進行作業系統核心和其它命令之間的互動。一般的命令解釋程式都具有接受用戶命令的輸入、解釋用戶命令和執行用戶命令的功能。一些功能較強的命令解釋程式還有一定的程式設計語言的特徵,某些命令解釋程式還具有對以前輸入過的命令進行重新編輯和執行的功能。
用戶通過界面與作業系統進行互動作用,因此界面的設計在很大程式上決定了用戶能否方便而有效地得到系統能夠提供的各種服務。Unix分時作業系統與用戶的界面是命令語言shell(外殼),其解釋程式同樣也被稱為shell,包含有ksh,bash,csh等。
基本結構
shell解釋程式基本上由四個部分組成(見圖)。如巳無命令行可讀入,或者執行login命令完全改換了進程圖象,或執行logout命令終止了進程則結束執行shell解釋程式。
調用方式
用命令調用
調用shell解釋程式命令的一般格式是:
sh〔—e〕〔—t〕〔—c〕〔name〔arg1…〔arg9〕〕〕
括弧中參數皆為可選。通常用這種命令調用shell解釋程式解釋執行一個shell過程,其格式是:
sh〔—e〕nameargmentlist
其中name是shell過程所在檔案名稱,argmen-iltst是傳向該過程的參數表,若用可選參數—e,則在執行每一條命令時,皆需列印此命令,並將代換的位置變數和shell變數用括弧括出列印。
在程式中調用
在程式中可用系統調用execl執行shell命令,但這不能實施輸入、出轉向、管道命令、sshell過程調用等。但如果調用執行shell解釋程式,情況大為改觀,
例如:
execl(“/bin/sh",“sh”,“name",“argl",…“argn”,NULL);
它調用執行shell解釋程式,而shell解釋程式又解釋執行一個shell過程,在過程名name之前可用可選參數—e。
如用可選參數“—c”,則調用方式可為:
execl(“/bin/sh”,“sh”,“—c,“Com-mandlist",NULL);
它調用shell解釋程式直接解釋執行命令表commandilst,命令表中可包含各種輸入、出轉向、管道操作等。
在程式中,如果調用執行方式是:
execl(“/bin/sh”,“sh",“—t”,NULL),
則從標準輸入讀一命令行,然後解釋執行,於是就可用互動作用方式執行一shell命令行。
在程式中如果用
execl(“/bin/sh”,NULL);
則shell解釋程式將從標準輸入逐行讀入命令並解釋執行。在login程式中就是使用這種方式為每個用戶運行一個shell解釋程式。
面向目標的命令解釋程式
在程式設計語言領域中,面向目標的範例設認為是構造複雜的大型軟體系統的重要輔助工具。這一認識緣於這種技術能提供數據抽象、類屬操作、軟體可再用性及繼承性支持。通過授權各個目標對自己的行為負責,用戶往往可以略去不必要的實現細節,而專注於相當高的層次上的設計決策。
在將近二十年的時間裡,Unix已證明是一種靈活穩妥的軟體升發環境。然而Unix系統時常因過於簡練和對新用戶不隨順而遭受批評。因此,考慮能否卓有成散地利用面向目標技術研製一種既能保特原系統的能力又能提供更具用戶親和性的外部特性的Unix命令解釋程式,是一個值得注意的問題。
普通Unix系統中的命令凋用可被看作是發出一種語言的具有過程性和函式性特徵的語句。檔案很象變數,而命令則是用以改變變數的操作。函式(即程式)被調用以創建或修改變數(即檔案)的值。此外,通過集中傳輸設施還可把函式組合起來以構成新函式。我新的命令解釋程式中儘可能地保留這種強制性質和函式性質,除此之外還要使之具備以面向目標方式說明動作的能力。
在這樣做時,第一步便是引入一種新型目標,即可執行目標。可執行目標在行一項單一的具體任務;它在普通Unix環境下對應於一個二進制的可執行原本或外殼原本。為使程式執行該項任務,用戶將選擇可執行原本,並選擇伴隨它的一切變元,然後選用系統信息execute傳送至被選擇目標。同普通系統的情況一一樣,execute信息將便外殼原本或二進制檔案被調用。
目標專用命令提供的功能度最終要通過可執行目標來實現。如前所述,一個目標將要對應的目標專剛命令的範圍取決於目標的種類(或類型)。
注意,這種做法不問子Smalltalk-80程式設計語言的做法,在該語言中,方法(響一命令時所執行的動怍序劉)不髓存於類描述之外。便方法僅作為可執行目標。我們可進行一種更靈活的命令調用,命令既可用面向目標的尾綴方式給出,也可用強制性前綴方式給出。
命令樹和進程族
shell解釋程式將命令行分解處理構成命令樹,樹中分層分布的各個節點功能單一,相對比較獨立(特列是命令型節點)。
而從Unix核的設計來看,任一進程都可用系統調用fork()生成子進程,於是很容易生成樹形結構的進程族。每個進程都可執行某個獨立的程式。從結構上看,二者非常匹配。
命令樹中各個節點按序執行,規則是從根節點開始,先左子樹、後右子樹,也就是說有一個比較簡單的前、後順序,Unix父、子進程的主要同步手段是等待,也就是父進程在生成子進程後,等待其終止,然後繼續運行,雖然這種同步手段似乎過於簡單,但卻充分滿足了命令樹節點順序執行的要求。
Unix子進程在生成時基本上複製父進程圖象。從shell解釋程式看,父進程圖象的一部分的確是子進程需要的。例如父進程數據段中某些數據(如命令行,命令樹等)、子進程要複製過來以便分析執行,又如父進程正文段的一部分正好是子進程要執行的,而父進程核心態第六頁更涉及資源共享(如標準輸入、出,pipe通訊機構以及其它打開檔案等),子進程有必要複製圖象的這些部分。當然父進程圖象的另外一些部分則是子進程不需要的,例如shell解釋程式中正文段的大部分。但如果注意到shell正文段是可共享的,根本不存在複製問題,則複製父進程圖象會降底效率的缺點就被沖淡了。
進程執行命令型節點時要按命令名執行相應命令處理程式。命令種類繁多,因此shell解釋程式不可能包含這些處理程式,Unix核的進程執行檔案機構則為此提供了一種妥善的解決辦法。於是shell解釋程式中執行命令型節點就只要使用系統調用exev(“name”,arglist),其中name是命令檔案名稱,arglist是參數表。
Unix將外部設備作為特殊檔案處理,這就為hsell中的輸入、出轉向、管道算符的實施提供了基礎。標準輸入、出能很方便的改換成其它外設和一般數據檔案,而命令執行過程卻無需作任何變動,這樣就將靈活性和一致性結合了起來。
Unix進程通訊機構pipe與一般作業系統不同,它是建立在檔案系統基礎上的,適宜於單向的大批量信息傳送,shell中的管道算符則是建立在這種通訊機構基礎上的。管道算符前、後命令之間的信息傳送是單向的,一般而言,數量比較大。