標籤:
SHELL種類,版本及選擇
凡是使用 *INX 的人,不論是作為 login shell 還是編程,多少都要接觸到 Shell。
經過多年的發展, Shell 的種類繁多。除了我們熟悉的 sh、ksh、csh、bash ... 外,還有各種 free 或商業版本如: RC、ES、EShell、psh、Zoidberg 等等。種類多了,也就有的標準化的要求,這就是 POSIX 的由來。
其實,就是常見的 Shell,也是功能不同,風格各異。一般來說,人們容易囤於固有的平台,使用 default 的 shell,也就是 /bin/sh。然而,不同的系統的 shell 從名字到 path 都不相同。由於最早的 shell 是 Bourne Shell,所以UNIX 上的 sh 就是 Bourne Shell。但現在有些混亂了,比如 HP-UX 11i 上已變成 POSIX sh 了。下面列出在個平台上常見 shell。
SHELL Solaris 9 HP-UX 11i AIX 5.3 SCO 7.14 LINUX (RedHat)
----- --------- --------- ------- -------- --------------
BSH /usr/bin/sh N/A /usr/bin/bsh /usr/bin/sh /bin/ash (bsh -> ash)
CSH /usr/bin/csh /usr/bin/csh /usr/bin/csh /usr/bin/csh /bin/csh -> tcsh
TCSH /usr/bin/tcsh N/A N/A N/A /bin/tcsh
KSH88 /usr/bin/ksh /usr/bin/ksh /usr/bin/ksh /usr/bin/ksh88 N/A
KSH93 /usr/dt/bin/dtksh dtksh /usr/bin/ksh93 /usr/bin/ksh N/A
BASH /usr/bin/bash N/A N/A N/A /bin/bash
PDKSH N/A N/A N/A N/A /bin/ksh
POSIXSH /usr/xpg4/bin/sh /bin/sh /usr/bin/psh /u95/bin/sh /bin/sh (-> bash)
ZSH /usr/bin/zsh N/A N/A N/A /bin/zsh
瞭解不同的 shell 及版本很重要,尤其當在不同平台之間移植程式時。我就曾協助一位朋友用 ksh93 寫了個 script,結果他在 sco 5.0.5 上不能執行,原來他是 ksh88,不支援 ++ 算符。
1. login shell for root user
root 使用者的 login shell 應該選用靜態串連(statically linked)版本的 shell,
如 /sbin/sh (solaris, HP-UX, SCO), /sbin/sash (RedHat Linux)
以防 share library 丟失或所在分區 mount 不上時, root 使用者可 login。
2. 用於編寫 script 的 shell,從可移植性和普遍性上考慮,建議用 ksh。
因為 POSIX 1003.2 就是以 ksh 為藍本的。而 bash 又是遵尋 POSIX 寫的。但 bash 除 linux 外,應用較少。而且,有些 ksh93 中的特性 bash 中沒有,如 associative arrays。
3. 一般使用者的 login shell,參考一下 Russell Quong 的《Shell scripts in 20 pages》:
Overall evaluation
Shell Interactive Scripting
sh C- B
ksh B+ A-
bash A A
csh B+ C-
tcsh A C+
zsh A- (?) A (?)
rc/es A- (?) A (?)
由於個人的原因,Russell 對 bash 過於偏好了。其實 zsh 應該是 A+,A+。zsh 基本上是 ksh、bash、csh 的 superset,功能十分強大。建議使用。去這裡 http://www.zsh.org/ 可更多的瞭解 zsh。可惜現在用的人不多。
不過這麼多 shell,有一點我不滿意,就是都缺少嵌入式的 awk 及 Regex 功能。psh (Perl Shell)是個彌補的例子,但畢竟不是真正的 Shell。本想自己寫一個,看了一下 bash 3.0 的 source code,有 30 萬行,只好做罷。
對於 sh、csh 就沒什麼好辦法了,因為曆史原因,一般無版本資訊,除非看 source code。
去這裡 http://www.in-ulm.de/~mascheck/bourne/ 看各平台對應的 sh。
SHELL種類,版本及選擇