Shell是什麼?
任何發明都具有供使用者使用的介面。UNIX供使用者使用的介面就是Shell(DOS的command熟悉吧,但UNIX的要強大的多)。
Shell為使用者提供了輸入命令和參數並可得到命令執行結果的環境。
為了不同的需要,UNIX提供了不同的Shell。現在的UNIX大部分都支援BourneShell,以下教程就以BourneShell(Bsh)為例,一步步的領略UNIX Shell的強大功能,佔先其強大魅力,達到更方便靈活的管理、應用UNIX的目的。
1.UNIX核心和Shell的互動方法
啟動UNIX時,程式UNIX(核心)將被調入電腦記憶體,並一直保留在記憶體中直到機器關閉。在引導過程中,程式init將進入後台運行一直到機器關閉。該程式查詢檔案/etc/inittab,該檔案列出了串連終端的各個連接埠及其特徵。當發現一個活動的終端時,init程式調用getty程式在終端上顯示login等登陸資訊。(username和passwd),在輸入密碼後,getty調用login進程,該進程根據檔案/etc/passwd的內容來驗證使用者的身份。若使用者通過身分識別驗證,login進程把使用者的home目錄設定成目前的目錄並把控制交給一系列setup程式。setup程式可以是指定的應用程式,通常setup程式為一個Shell程式,如:/bin/sh 即Bourne Shell(command出來了,呵呵)。
得到控制後,Shell程式讀取並執行檔案/etc/.profile以及.profile。這兩個檔案分別建立了系統範圍內的和該使用者自己的工作環境。最後Shell顯示命令提示字元,如$。(這是以bsh為例,若是csh,為.cshrc,ksh為.kshrc,bash為.bashrc等等) 注不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或config.sys檔案)
當shell退出時,核心把控制交給init程式,該程式重新啟動自動登陸過程。有兩種方法使shell退出,一是使用者執行exit命令,二是核心(例如root用kill命令)發出一個kill命令結束shell進程。shell退出後,核心回收使用者及程式使用的資源。
使用者登陸後,使用者命令同電腦互動的關係為:命令進程--->Shell程式--->UNIX核心--->電腦硬體。當使用者輸入一個命令,如$ls,
Shell將定位其可執行檔/bin/ls並把其傳遞給核心執行。核心產生一個新的子進程調用並執行/bin/ls。當程式執行完畢後,核心取消
該子進程並把控制交給其父進程,即Shell程式。例如執行:
$ps
該命令將會列出使用者正在執行的進程,即Shell程式(下來詳細說說,別急現在)和ps程式。若執行:
$sleep 10 & $ps
其中第一條命令將產生一個在後台執行的sleep子進程。ps命令執行時會顯示出該子進程。
每當使用者執行一條命令時,就會產生一個子進程。該子進程的執行與其父進程或Shell完全無關,這樣可以使Shell去做其他工作。(Shell只是把使用者的意圖告訴核心,然後該幹嘛幹嘛) 現在windows有個計劃任務(在固定的時間,日期自動執行某任務),其實UNIX很早就有這個功能了,也就是所謂的Shell的自動執行。一些UNIX資源,如cron可以自動執行Shell程式而無需使用者的參與,(這個功能好象在/var/spool/crotab目錄裡)。
Crontab 程式對於系統管理員來說是非常有用的。Cron服務用於排程器在特定時間(月、日、周、時、分)運行。我們以root的crontab 為例。根使用者的crontab 檔案放在 /var/spool/crontab/root 中,其格式如下:
(1) (2) (3) (4) (5) (6)
0 0 * * 3 /usr/bin/updatedb
1. 分鐘 (0-60)
2. 小時 (0-23)
3. 日 (1-31)
4. 月 (1-12)
5. 星期 (1-7)
6. 所要啟動並執行程式
2.Shell的功能和特點
1>命令列解釋
2>使用保留字
3>使用Shell元字元(萬用字元)
4>可處理常式命令
5>使用輸入輸出重新導向和管道
6>維護一些變數
7>運行環境控制
8>支援Shell編程