凡是使用 *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
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。
bash
bash是Linux标准默认的shell,本教程也基于bash讲解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。
Linux使用它作为默认的shell是因为它有诸如以下的特色:
- 可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。
- 自动通过查找匹配的方式给出以某字符串开头的命令。
- 包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。
sh
sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
ash
ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。
csh
csh 是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该shell其实是指向/bin/tcsh这样的一个shell,也就是说,csh其实就是tcsh。
ksh
ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
注意:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C
shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。