shell 版本
来源:互联网 发布:网络写手兼职 编辑:程序博客网 时间:2024/06/07 06:09
凡是使用 *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,ksh93
# 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.
去这里 http://www.in-ulm.de/~mascheck/bourne/ 看各平台对应的 sh.
ubuntu之bash/dash
从 ubuntu 6.10 开始,ubuntu 就将先前默认的bash shell 更换成了dash shell;其表现为 /bin/sh 链接倒了/bin/dash而不是传统的/bin/bash。
ubuntu edgy是第一个将dash作为默认shell来发行的版本,这似乎是受了debian的影响。wiki 里面有官方的解释,https://wiki.ubuntu.com/DashAsBinSh,主要原因是dash更小,运行更快,还与POSIX兼容。
但目前存在的问题是,由于shell的更换,致使很多脚本出错,毕竟现在的很多脚本不是100%POSIX兼容。
在wiki里面也说到,如何将默认的shell改回bash,方法就是
在终端执行 sudo dpkg-reconfigure dash
然后选择 no。
或者是干脆比较暴力地"ln -sf /bin/bash /bin/sh"
- shell 版本
- Shell:查看Linux版本
- shell系列------改进版本的shell脚本
- RHEL6.5 更改Shell版本
- adb shell 获取版本信息
- shell版本的彩色进度条
- 启动程序脚本,shell版本
- 用shell 自动备份SVN版本库
- vBulletin 论坛全版本 后台拿shell
- 如何检测当前系统的 shell 版本
- win shell获取判断系统版本
- 自动部署版本包shell脚本
- 用python和shell检测centos版本
- 改进版本的压缩和解压的shell脚本
- 查看各种Linux系统版本信息的Shell命令
- 文档分享:Bash shell学习笔记 PDF版本
- DEDEcms GET shell 再次通杀 所有版本
- shell脚本实现图片文件的重命名之修订版本~
- iOS开发与OpenGL ES相关问题整理(2)- 绘制图片上下颠倒
- javascript获取select的值全解
- 求一个字符串中连续出现次数最多的子串
- 快乐
- Android Launcher 内存分析
- shell 版本
- research paper for one sight
- Bootstrap学习笔记
- SAP table类型
- OCP-047 delete from ( subquery)
- web聊天室及时清理离线用户(最简单的方法)
- python3 获取网页内容保存到文件
- HBase 0.94.1的编译过程
- java更改文件名