網路農夫 --  Home 網路農夫 --  Home
網路農夫 --  Home
wait.....

2-3 C Shell的運用面

對於一個使用 C shell 作為人機使用界面的 UNIX 作業系統使用者而言,C shell 到底提供了你什麼樣的功能呢?讓我們分別從“指令行模式下”、“製定使用環境”與“程式設計”這三個方面來為你說明。希望您能藉此先行建立與瞭解 C Shell 應用面的概念。

2-3-1 指令行模式下

我相信這應該是使用者最為熟悉的運用層面。所以我使用幾個關鍵性的功能名詞來做為區隔為您分項扼要的說明:

 

輸入/輸出重導向(I/O redirerction):
提供一套規則讓使用者可將執行所需的輸入或執行所得的輸出做重導向的組合運用。如重導向輸出為檔案,或將檔案重導向作為指令的輸入等。這個項目可以說相當基礎,是有必要全盤瞭解的。

 

特殊符號(Regular Expressions):
C Shell 定義了一套關於特殊符號的功能定義叫做 Regular Expressions。一般所提到的 wildcard 以及各項的括符引號、斜線、倒斜線等定義及使用的法則均包含在裡面。這一套符號規則常式要說簡單嗎?可算是簡單,只要理解的話,不管在指令的使用或者是 sed、awk 的應用都可事半功倍。(不過老實說,一段時日沒接觸的我看到了,回頭看以前自己寫的符號堆,有時也頗具催眠作用)

 

管道(Pipes):
的功能則是讓你輕易地將一個指令的輸出結果,做為另一個指令的輸入。個人建議您善用這項功能。

 

過去指令使用記錄(history):
可以迅速地將已使用過的指令再次執行,或者是做部份引數上的修改並重新加以執行。看似簡單的理念,不過可以做到相當複雜的變化,可以說是一項非常好用但可以使人懶到極點的好功能。

 

別名(aliases):
提供使用者自行設定簡單的字串來取代複雜的指令選項或多個指令的連續組合。這一項使用者絕對不可不會。

 

工作控制(job control):
在單一的終端機螢幕模式下,掌控具分時多工特性的 UNIX 作業系統。此功能可能在現今 X-Windows 介面下變的比較不重要了,不過還是建議您多少看一下,因為事實上,這項功能還是相當好用的。

 

內建指令(Build-in command):
在這個模式下,C Shell 負責解譯與執行 UNIX 指令,同時也提供一些常用的內建指令提昇系統的使用效率。這些所謂的內建功能我認為多少還是要瞭解一點,雖然你有可能常使用而不自覺。

2-3-2 製訂使用環境

當一個使用者想要主動去瞭解如何制訂與如何改變使用環境時,便算是已經來到進階門檻之前了。

以一個使用 C Shell 的使用者而言,簽入(login)UNIX 系統後,系統會幫你啟動一個 C Shell 做為你的 login shell,此 login shell 將會常駐在記憶體中,一直到你簽出(logout)UNIX系統為止。

C shell 定義了預設變數(predefined variables)及環境變數(environment variables)用來控制使用者的使用環境,設定的方式是在使用者簽入系統時由 login shell 讀取特殊的起始檔案(startup files)作為設定的依據,如果使用者沒有屬於自己的起始檔案,則 login shell 將會讀取系統的預設檔案來加以設定。

 

C shell 所定義的三個起始檔案分別是“.login”、 “.cshrc”、 “.logout”,這三個起始檔案的檔案格式是一般的文字檔,使用 vi 便可編輯。在使用者 login 後 login shell 會先讀取“.cshrc”然後再呼叫“.login”,依據這兩個起始檔案的內容制訂出使用者的使用環境(至於兩類變數應設定在那一個起始檔案中,稍後再做討論);當使用者要 logout 時 login shell 則會讀取“.logout”並執行該特殊檔案的設定,然後才會退出系統。

 

使用者個人的啟始檔案必須放在自己的 home 目錄下,如果你用指令 ls 看不到的話請不用驚訝,因為我們前面已經提過它們是特殊檔案,你必須使用指令 ls -a 才會顯示出來。如果還看不到,這也用不著奇怪,這可能是因為你的系統管理者為你建立 account 時忘了幫你拷貝的緣故吧。如果您使用了 UNIX 作業系統已有一段時日,到今天您才發覺到您根本沒有自己的 “.cshrc” 及 “.login” 啟始檔案的話,你一定會質疑它們必須存在的必要性與重要性?因為過去你沒有這些檔案還不是用的好好的!事實上並非如此,因為當你個人的 home 目錄下沒有這些啟始檔案時,shell 依舊是必須去讀取系統為你準備的原始的啟始檔案,所以說如果你沒有這些啟始檔案,你可以在 UNIX 的檔案系統找到系統原始的啟始檔案,以 Sun OS 4.1.X 而言檔案的位於 /usr/lib 目錄內,檔案名稱是 Cshrc 及 Login。你可以將它們拷貝一份到你的home目錄下作為參考,以便於你在學習中做為設定的範本。(在此說明,以後我們所討論的啟始檔案都將是以你的 home 目錄下的必須有這些啟始檔案為前提。)

 

以下針對這三個檔案分為做功能上的區隔簡介(說明的部份僅只是建議,因為這三個檔案的使用具有相當大的彈性)。

 

“.cshrc”檔案

對我個人而言,這是個令我印象深刻的特殊檔案,也就是曾經把菜鳥時代的我最喜歡亂設定,然後電腦就罷工的特殊檔案“.cshrc”(其意大概是為 C Shell resource control)。對login shell而言,這是第一個讀取的啟始檔案(啟始檔案的位置在使用者的home dir.下)。使用者必須知道一點就是 login shell 產生 sub shell 時,sub shell 也會讀取“.cshrc”檔案,但 sub shell 不會再讀取“.login”,此運作法則請務必注意。

 

一般而言“.cshrc”使用者必要作改變的環境變數(environment variables),由於前面提到過 login shell 產生 sub shell 時也會讀取“.cshrc”,所以設定的變數是會遺傳的這點也請切記(所以在不確定的因素下,不建議自己作不必要的環境變數設定,以免後患無窮)。至於預設變數(predefined variables)的部份,牽涉到的大都是屬於 C shell 本身所提供的操作功能,建議您視變數的特性作必要的設定(因為並非全部的變數都適合在“.cshrc”中設定的)。

 

設定上的實際例子我放在第四、五章中有相關內容時再作說明。

 

“.login”檔案

login 進入 UNIX 系統的方式大致說來可分為從 console login,remote login 兩類。前者比較單純,也就是在主機簽入系統,所以螢幕、鍵盤等設定使用的是主機系統的周邊,一般而言都不會有問題。而後者是藉由網路或連線裝置從系統外簽入 UNIX 系統,譬如由另一個 UNIX 主機使用 rlogin 簽入系統;又譬如,從 MS Windows 的個人電腦使用 telnet 簽入系統,或者是從 VT220 的終端機遷入系統等等,由於使用的並非是主機的周邊,有時候必須針對這種情況先加以判斷,然後再加以設定特殊的周邊裝置參數,否則時常會發生如鍵盤或者編輯上(特別是使用 vi 指令時)的小問題。

 

適當的“.login”檔案設定可以應付上述的情況,設定的情況得視實際的狀況而定。

 

“.logout”檔案

這個特殊檔案是 C Shell 專有的,它的用途我想你應該猜的到,就是在你退出系統前才會執行的特殊檔案。也就是在你的 login shell 要終止之前,C shell會到你的 home 目錄之下去尋找這個特殊檔案,並依其內容的設定加以執行。由於在功能上屬於非並必要性,所以在一般的 UNIX 系統中,這個特殊檔案並不像“.cshrc”及“.login”在系統中的有預設檔案的存在。如果使用者個人需要的話,必須自己使用文字編輯工具作自己的設定。

 

我個人認為 C shell 的這項功能非常適合來做一些暫存檔案的清除,或者是個人工作資料與記錄的整理及備份,或者是一些備忘錄資料的顯示等等。

 

對於 UNIX 系統的起始檔案,最好能有系統的預設檔案,這部份應該是系統管理者的責任。使用者個人在有正確的認知情況下,可依據個人的需求再加以調整與設定,當然調整設定後的後果,正確的說使用者應自行負責。對於起始檔案,使用者應該要有自己設定的做修改與設定。如果一個 UNIX 系統的管理者與使用者無法共同做到此點,便應該再自我提昇對系統的使用能力。

2-3-3 程式設計

C Shell 雖然是一個負責解譯及執行指令的使用者界面,但是它的功能卻不僅只限於此而已(事實上,在 UNIX 系統中,三個 shell 均具有此特性,而這點特性,便是我喜歡 UNIX系統的主要原因)。 C Shell 提供在語法上類似於 C Language 的流程控制(control flow),也正是 C Shell 得其名的主因。由於具有此項功能,在程式設計上對於一個學習過 C Language 的使用者而言相當容易適應。同時 C Shell 的包容性上也比 Bourne Shell 及 Korn Shell 來得好。不過事實上,有些 UNIX 作業系統的專家相當反對使用 C shell 來撰寫程式,如 Tim O‘Reilly 及 Jerry Peek 兩位 UNIX 的先進大師在其 UNIX 的偉大著作 UNIX POWER TOOLS 中,就以一個章節的篇幅來說明 C Shell 在撰寫程式時會產生的限制及 bugs。(UNIX POWER TOOLS 第49章 “C Shell Programming ... NOT”)。原因事實上很簡單,就是不夠嚴謹,且有一些致命性的 bug 存在。原本我的寫作計畫中,想對此部份做比較深入的介紹,後來也受到此篇文章的影響,修改過不少 script 範例,不過仍然無法擺脫其陰影。所以目前此部份正在重寫中。建議有心想要瞭解這部份的使用者,可以讀一讀 GAIL ANDERSON 與 PAUL ANDERSON 合著的『The UNIX C SHELL FIELD GUIDE』,我相信您絕對能有相當大的收穫。

 

版本:Beta-2001-05 -- 網路農夫