7.1引言

當用戶注冊進入XENIX係統後,他們便與若幹個命令解釋程序相互通訊。這一章討論shell命令解釋程序sh。這一命令解釋程序是一個XENIX係統中的程序,它支持了一個表達能力極強的命令語言。每一個對此命令解釋程序的調用都稱作一個shell;每個shell都具有同一個功能:從它規定的標準輸入裏讀出命令,並執行此命令。

由於shell向用戶提供了一個高層的命令語言,而用戶可以利用此語言與操作係統相互通訊,由此使得XENIX可以在從未有過的比較簡單的操作係統中執行任務處理。在shell語言中,那些通常需要用傳統的程序設計語言來編寫的命令,可以僅用shell程序語言寫成一個shell過程。在其它的操作係統中,命令在嚴格的先後順序的條件下執行;而在XENIX中,由於有了shell命令解釋程序。

另外,命令可以“改向”,“改向”可以將輸入從一個源移到另一個輸入源,可以將命令執行的結果輸出到一個文件中、一台終端上、一台打印機上或者輸出到另一個命令中。這一特點提供了一對一特殊目的的任務裁決的靈活性。

7.2基本概念

shell本身(即,注冊後讀取你的命令的程序,或者使用sh命令調用的程序)是一個用C語言寫的程序,它並不是操作係統特有的一部分,而是一個一般的用戶層程序。

7.2.1shell是怎樣創建的

在XENIX中,一個進程是一個具有指令、數據、輸入和輸出的執行實體。所有的進程都有它們自己的生存周期,甚至可以啟動[或分叉(fork)產生]新的進程。因此,在任一給定的時刻,可以有若幹個進程在執行,其中有些進程可能是其它進程的子進程。

用戶注冊進入操作係統就被指定了一個“shell”,用戶可通過shell來執行命令。這個shell是shell命令解釋程序的一個私有副本,它從鍵盤讀取命令。在這種意義上,可將shell簡單地看作是一個進程。

在XENIX多任務環境下,可以使用命令語言來建立文件,並將它送到“後台”加以處理。這樣,用戶在“後台”運行他們的程序時,用戶在“前台”仍可繼續他們的工作。

7.2.2命令

最通常使用shell的途徑是在鍵盤上鍵入簡單的命令。一個簡單命令是任意一個由空格符和製表符分隔的自變量序列。第一個自變量(編號為o)說明了要執行的命令的名稱。任何其它的自變量,除很少的特例外,將作為自變量傳遞給命令。

如果一條命令的第一個自變量說明的文件是可執行的(由與此文件相關的一組相應的存取權限位指明),並且它確實是一個已編譯的程序,則shell作為父進程,建立一個立即執行這個程序的子進程。如果係統中的文件標誌為可執行的,但它又不是一個經過編譯的文件,則係統假設它是一個shell過程,即一個由shell命令行組成的普通正文文件。在這種情況下,shell創建一個與它本身同樣的實體(子shell),由子shell讀取此shell過程文件中的命令,並執行。

從用戶的觀點來看,經過編譯的程序與shell過程都是用同一種方法調用的,由shell決定用什麼樣的方法來實現它們的執行,而不是需要用戶來做這件事。由此,係統向用戶提供了調用的一致性。

7.2.3shell怎樣查找命令shell通常在文件係統中的三個不同位置查找命令。首先shell嚐試按用戶給出的命令名來查找可執行的文件,如果失敗了,則shell在原有的命令名上前綴/bin,然後繼續查找,如果又失敗了,則shell在原有的命令名上前綴上/usr/bin,然後再查找。由此產生的效果是在下麵的三個目錄裏順序查找用戶給出的命令名。首先是當前目錄,其次是/bin目錄,最後是/usr/bin目錄。例如pr和man命令實際上分別是/bin/pr和/usr/bin/man。另外係統也可處理更為複雜的路徑名,它們可以是為定位一個文件與用戶當前目錄相關的相對路徑名,也可以是使用一個命令的絕對路徑名。如果用戶給出的命令包含斜線(如/bin/sortdir/cmd),則係統不執行前綴處理操作,隻是在當前目錄中,按用戶給定的命令名來查找和執行。

shell的這種命令名查找機製,為用戶提供了一個很方便的途徑來執行係統中的公用命令和在用戶當前目錄中或在用戶當前目錄附近的命令,當然它也有處理係統中任何可使用的命令的能力,而不論此命令在文件係統結構中的位置如何。由於係統在命令查找時首先查找的:是當前目錄,因而任何用戶都可以保存一個公用命令的私有版本,而不會影響到其它用戶。同時在係統中建立新的公用命令也不會影響到那些已往有了與此命令名相同的私有命令的用戶。