1. Shell的歷史

Shell的作用是解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條,這種方式稱為互動式(Interactive),Shell還有一種執行命令的方式稱為批處理(Batch),用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。Shell腳本和編程語言很相似,也有變數和流程控制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。

由於歷史原因,UNIX系統上有很多種Shell:

  1. sh(Bourne Shell):由Steve Bourne開發,各種UNIX系統都配有sh

  2. csh(C Shell):由Bill Joy開發,隨BSD UNIX發佈,它的流程控制語句很像C語言,支持很多Bourne Shell所不支持的功能:作業控制,命令歷史,命令行編輯。

  3. ksh(Korn Shell):由David Korn開發,向後兼容sh的功能,並且添加了csh引入的新功能,是目前很多UNIX系統標準配置的Shell,在這些系統上/bin/sh往往是指向/bin/ksh的符號連結。

  4. tcsh(TENEX C Shell):是csh的增強版本,引入了命令補全等功能,在FreeBSD、Mac OS X等系統上替代了csh

  5. bash(Bourne Again Shell):由GNU開發的Shell,主要目標是與POSIX標準保持一致,同時兼顧對sh的兼容,bashcshksh借鑒了很多功能,是各種Linux發行版標準配置的Shell,在Linux系統上/bin/sh往往是指向/bin/bash的符號連結[38]。雖然如此,bashsh還是有很多不同的,一方面,bash擴展了一些命令和參數,另一方面,bash並不完全和sh兼容,有些行為並不一致,所以bash需要模擬sh的行為:當我們通過sh這個程序名啟動bash時,bash可以假裝自己是sh,不認擴展的命令,並且行為與sh保持一致。

檔案/etc/shells給出了系統中所有已知(不一定已安裝)的Shell,除了上面提到的Shell之外還有很多變種。

# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen

用戶的預設Shell設置在/etc/passwd檔案中,例如下面這行對用戶mia的設置:

mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

用戶mia從字元終端登錄或者打開圖形終端窗口時就會自動執行/bin/bash。如果要切換到其它Shell,可以在命令行輸入程序名,例如:

~$ sh(在bash提示符下輸入sh命令)
$(出現sh的提示符)
$(按Ctrl-d或者輸入exit命令)
~$(回到bash提示符)
~$(再次按Ctrl-d或者輸入exit命令會退出登錄或者關閉圖形終端窗口)

本章只介紹bashsh的用法和相關語法,不介紹其它Shell。所以下文提到Shell都是指bashsh



[38] 最新的發行版有一些變化,例如Ubuntu 7.10的/bin/sh是指向/bin/dash的符號連結,dash也是一種類似bash的Shell。

$ ls /bin/sh /bin/dash -l
-rwxr-xr-x 1 root root 79988 2008-03-12 19:22 /bin/dash
lrwxrwxrwx 1 root root     4 2008-07-04 05:58 /bin/sh -> dash