2010年1月11日 星期一

UNIX Shell: 概說

對初學者來說,本章講解的是 shell 的基本概念。對進階使用者來說,本章列舉了一些 C shellKorne shell 和 Borne shell 間的基本差異。若需要這些 shell 的詳細說明,請參考第四第五兩章。

下列為本章要點:

* Shell 簡介
如何正確使用 shell
不同的 shell
共通的特點
特有的功能



Shell 簡介


我們先把 UNIX 想像成一輛車。開車的時候,我們用不同的方式對車子下 命令 ",比如轉方向盤,踩煞車,踩油門等等。可是這些動作怎樣才變成車子真正的動作呢? 轉向加速減速等等 這就是透過車子的傳動裝置,也可看做是車子的使用介面。車子有可能是前輪傳動,後輪傳動,或是四輪傳動,甚至是三種的組合。


對 UNIX 來說,Shell 就像是車子的使用介面,種類也相當多樣化。有些系統只提供一種 shell,有些則提供不少選擇。每種 shell 的特點不同,但相同的是,這些 shell 都會影響指令解譯的結果,並提供不同的工具來建立 UNIX 操作環境。

Shell 只是一個讓系統了解指令的程式 所以常稱為指令解譯器 )。對大部份的使用者來說,shell 幾乎是隱形的。使用者在意的只是系統是否按照指令動作,而不是怎麼動作。以車子的例子來說,踩煞車就是要車子停下來,不管用的是鼓煞還是碟煞系統。


Shell 的目地


使用 shell 的目地有三個 :

互動地使用系統
自訂 UNIX 使用環境
程式設計


互動地使用系統


當我們稱系統在互動環境 "下時,意思是說,系統會用個提示符號等待你輸入指令。指令可以包括特殊符號,可以不必打出完整檔名,或是將輸出入重導向。


.自定 UNIX 使用環境


UNIX shell 下有一些變數可以用來控制系統。比如有些變數可以告訴系統你的目錄在哪,或是信件該放在哪個目錄中。有些變數是系統內定的,其他的可以從啟使檔中定義,在登入時就會自動設定。啟始檔案也可以包括 UNIX 指令或是 shell 命令,每次登入時都會自動執行。



程式設計


UNIX shell 提供了一些特殊的指令,可以用來寫 shell script。不少 shell 內建的指令可以當做一般的 UNIX 指令在互動環境下使用,也有不少 shell script 中包含大量的 UNIX 指令。shell script 最有用的地方,就在於可以依序執行一系列的指令,跟 MS-DOS 的批次檔類似。script 也和許多高階語言一樣,提供迴圈,可以重複執行指令。


不同的 shell


UNIX 有許多不同的 shell。本書討論最常見的三種:

* Bourne shell( 或稱為標準 shell),這是最小最簡單的 shell
* Korn shell,比 Bourne shell 更進步些,可以編輯指令行
* C shell,語法和 相同,使用上相當方便


大部份的系統都有許多種 shell,通常使用者會用 Bourne shell 寫 shell script,但互動環境使用另一種 shell


/etc/passwd 檔可決定在互動的UNIX環境下,哪一個 shell 會發生作用。在登入時,系統會去檢查 /etc/passwd 檔的內容,每一行 ( entry ) 最後一個欄位就是互動環境下的 shell 程式名,例如 :


程式名稱              所使用的 shell
﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍﹍
/bin/sh                            Bourne shell
/bin/rsh              限制下的 Bourne shell
/bin/jsh              加上 job 管理的 Bourne shell
/bin/ksh              Korn shell
/bin/rksh              限制下的 Korn shell
/bin/csh              C shell



你可以隨時打入不同的 shell 程式名稱以變換 shell。如果想要換成 C shell,只要打入 :

$ exec csh

就可以了。



共通的特點


下表是 BourneKorn 和 C shell 一些共通的特點。值得注意的是,Korn shell 是 Bourne 
shell 的延伸,所以包含所有 Bourne shell 的特點,加上自己獨有的特點。Bgfgjobs
stop 和 suspend 只有在支援 job 控制的系統上才有用。


符號 指令               意義 動作

>                            將輸出重導向
>>                            附於檔尾
<                            將輸入重導向
<<                            立即輸入 (Here 檔案 )
|                            pipe 輸出
&                            將該 process 放入背景執行
;                            同行不同指令的分隔符號
*                            萬用字元 不限字數 )
?                            單一萬用字元
[ ]                            找出符合括號中的字串的檔名
( )                            開子 shell 執行該指令
` `                            替代引號中指令的輸出
" "                            部份引用 可以進行變數與指令的展開 )
' '                            全部引用 不可展開 )
\                            引用後面的單一字元
$var                            取得變數的值
$$                            process ID ( 行程編號 )
$0                            指令名稱
$n                            第 個參數 (0<9)
$*                            將所有參數集合起來
#                            註解符號
bg                            背景執行
break                            跳出迴圈
cd                            換目錄
continue                            繼續迴圈
echo                            顯示輸出
eval                            計算參數
exec                            開一個新的 shell
fg                            前景執行
jobs                            顯示目前的 job
kill                            停止正在執行的 job
newgrp                            切換到新的群組
shift                            移動參數位置
stop                            暫停某一背景 job
suspend                            暫停某一前景 job
time                            將該指令執行時間加以計時
umask                            設定或是顯示檔案存取權限
unset                            清除變數或是函式定義
wait                            等待背景程式結束

                               


沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!