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。

 
 
 

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中执行。

SHELL种类,版本及选择的更多相关文章

  1. linux shell种类

    1.shell 种类 目前我们的 Linux (以 CentOS 5.x 为例) 有多少我们可以使用的 shells 呢? 你可以检查一下 /etc/shells 这个文件,至少就有底下这几个可以用的 ...

  2. 码农飞升记-02-OracleJDK是什么?OracleJDK的版本怎么选择?

    目录 1.Oracle JDK 是什么? 2.Oracle JDK 版本如何选择? 1.Java SE 发布节奏以及不同版本的差距 1.Java SE 8 以及之前版本的发布节奏和不同版本的差距 1. ...

  3. 管理 node 版本,选择 nvm 还是 n?

    来源:http://taobaofed.org/blog/2015/11/17/nvm-or-n/ 引子 我本机安装着 nvm,而 node 本来一直运行在 0.x 的老版本上.后来为了跑 ES6,我 ...

  4. 【和我一起学python吧】初学Python,版本如何选择?

    早在四年多以前,在我进入英才网之前,去面试过一家海归创业的公司.他们需要的是有unix开发经验的技术人员,但是因为他们当时所处的阶段对很多成熟 技术人员不是很吸引,所以条件放宽为熟悉面向对象的程序开发 ...

  5. Windbg 32位版本和64位版本的选择

    习惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然,当你安装Debugging Tools for Windows的时候,你将发现有两个系列的工具 ...

  6. 安装ipython,使用scrapy shell来验证xpath选择的结果 | How to install iPython and how does it work with Scrapy Shell

    1. scrapy shell 是scrapy包的一个很好的交互性工具,目前我使用它主要用于验证xpath选择的结果.安装好了scrapy之后,就能够直接在cmd上操作scrapy shell了. 具 ...

  7. 小飞侠带你精通Python网络编程系列03-Python版本的选择

    1. 目前Python有两个主要版本Python2.X和Python3.X 2. Python2.X最后一个版本是2.7,目前(2018年10月21日)Python3.X最新版本为3.7 3. 很不幸 ...

  8. hadoop商业版本的选择介绍

    记得刚接触到hadoop的时候跟大部分人一样都会抱怨hadoop的安装部署问题,对于一个新手来说这这的是个头疼的问题,可能需要花费一整天的时间才能把分布式环境安装配置好.在刚接触hadoop的一段时间 ...

  9. Hadoop版本的选择问题

    自从2013年下半年开始,hadoop的版本开始了快速的更新换代,这和通信和互联网行业(ICT)的发展是密切相关的.随着移动网络的和宽带网络的覆盖以及数据传输速率的提升,线上的数据有了爆炸式的增长.这 ...

随机推荐

  1. openwrt l7过滤qos配置

    openwrt l7过滤qos配置     电梯直达 1# 本帖最后由 木鸟 于 2010-7-27 10:22 编辑 openwrt的qos基于hsfc.提供了分类标记,流量控制等功能,可能还有整形 ...

  2. 深入浅出Node.js (7) - 网络编程

    7.1 构建TCP服务 7.1.1 TCP 7.1.2 创建TCP服务器端 7.1.3 TCP服务的事件 7.2 构建UDP服务 7.2.1 创建UDP套接字 7.2.2 创建UDP服务器端 7.2. ...

  3. 【转】Android 定时器实现的几种方式和removeCallbacks失效问题详解--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/9011193 实现定时器有很多种方式,在这里我简单的介绍几种方式 (1)使用Handler + ...

  4. Delphi7下实现HTTP的Post操作 转

    Delphi7下实现HTTP的Post操作 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Gra ...

  5. poj1185:炮兵阵地(状压dp)

    也算是比较基础的状压dp了,跟做过的第二道比较又稍微复杂了一点 需要记录之前两行的状态.. 统计结果也稍有不同 另外还学习了一个得到一个整数二进制位 1 的个数的位运算方法 详见代码: #includ ...

  6. poj 2392 Space Elevator(多重背包+先排序)

    Description The cows are going to space! They plan to achieve orbit by building a sort of space elev ...

  7. log4net 快速上手使用

    *本随笔仅限快速上手,如需深入探究,可查阅其它博友. 一.下载log4net.dll并添加引用; 二.添加配置文件 log4net.xml : <?xml version="1.0&q ...

  8. html checkbox全选或者全不选

    /* 全选或全不选 */ function CheckedAllOrNo() { var arr = $(':checkbox'); for (var i = 1; i < arr.length ...

  9. LDAP协议介绍

    LDAP协议基础概念  1. 从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合"一次记录多次读取".经常使用LDAP服务存储的信息: 公司的物理设备信息(如打印机,它的I ...

  10. Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表

    在接下来的教程中,我们将实现一个简单的JasperReports示例,展现其基本的开发.使用流程.文章很长,不过是以图片居多,文字并不多. 实例中使用最新的Jasper Studio5.2进行报表设计 ...