首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SHELL 种类,版本及选择

SHELL 种类,版本及选择

SHELL 杂谈[1]:种类,版本及选择

凡是使用 *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 万行,只好做罢。

4. Shell 版本的确定

ksh88

# strings /bin/ksh|grep -i version
@(#)Version M-11/16/88i   

# set -o emacs on
# ^V
@(#)Version M-11/16/88i   

------------
ksh93

# echo ${.sh.version}
Version M 1993-12-28 o+

------------
tcsh

# echo $version
tcsh 6.11.00 (Astron) 2001-09-02 (sparc-sun-solaris) options 8b,nls,dl,al,kan,rh,color,dspm

------------
bash

# bash -version
GNU bash, version 2.05.0(1)-release (sparc-sun-solaris2.9)
Copyright 2000 Free Software Foundation, Inc.

# echo  $BASH_VERSION
2.05.0(1)-release

------------
zsh

# echo $ZSH_VERSION
3.0.8

对于 sh、csh 就没什么好办法了,因为历史原因,一般无版本信息,除非看 source code。


=========================
在查找 Solaris 和 Red Hat 系统中 ksh 的区别时,在CU上看到这篇文章,转载过来,稍微改了下排版,未改内容。
继承事业,薪火相传
返回列表