Shell 脚本的简单介绍

什么是 Shell

Shell 应该是命令解释器,将 Shell 脚本解析成操作系统能理解的操作去执行。 Shell 脚本就是一系列的命令合集。

Shell 的种类

Unix/Linux 上常见的 Shell 脚本解释器有 bash、sh、ash、csh、ksh 等,习惯上把它们称作一种 Shell。我们常说有多少种 Shell,其实说的是有多少种 Shell 脚本解释器。

在不同的操作系统中,支持的 Shell 脚本是不一样的,不同的 Shell 脚本的命令和语法方式也有所区别的。

在 Linux 下面可以执行下面命令,来查看支持的 shell 的种类:

cat /etc/shells

在网上查了下资料,大体上有这么几种 shell:

  1. Thompson shell 这是世界上第一个 Unix shell,1971 年发行的第一版 Unix 操作系统就包含了它,是一个非常简单的命令行解释器。它的作者是 Ken Thompson

  2. sh 全称叫 Bourne Shell,1976 年在贝尔实验室被开发出来,为的就是要替代 Thompson shell,作者是 Stephen Richard (Steve) Bourne。后来为了纪念作者所以名字叫 Bourne Shell,简称 sh,再后来成了 Unix 标准默认的 shell。

  3. csh 全称叫 C Shell,作者是 Bill Joy,1978 年在伯克利的加利福尼亚大学时开发完成的,主要是为了让用户更容易的使用交互式功能,并把 ALGOL 风格的语法结构变成了 C 语言风格。

  4. tcsh 全称叫 TENEX/TOPS C shell,是 csh 的增强版,并且完全兼容 csh。它不但具有 csh 的全部功能,还具有命令行编辑、拼写校正、可编程字符集、历史纪录、作业控制等功能。所以后来大家都纷纷用 tcsh 取代 csh。早期的 OS X 是预装 tcsh 来作为默认的 shell 的,后来在 10.3 版本后就把 bash 作为默认的 shell 了。

  5. ksh 全称叫 Korn Shell,作者是 David Korn。有很长一段时间,大家要么选择 Bourne shell,要么选择 C shell,为了改变这种状况,到了 1983 年,当时在贝尔实验室的 David Korn 开发了 Korn shell。ksh 结合了所有的 C shell 的交互式特性,融入了 Bourne shell 的语法,并新增了诸多其他功能。 在 2000 年前 ksh 都还一直是 AT&T 的专有软件,后来经历复杂的版本演变和 license 变更,成为了一个开源的软件。原生的 ksh 一般是指 ksh88,AIX 操作系统把它作为默认的 shell,后来经历了多个版本的演变,比如 ksh93ksh93uksh93tksh93v。 后面在其基础之上又衍生出了多个 shell 的变种,如:dtksh、tksh、oksh、mksh、SKsh、pdksh。

  6. ash 全称叫 Almquist shell,它是一种轻量级的兼容 sh(Bourne Shell)的 Shell,大小只有 92K,对于小内存的机器非常有帮助,但是不提供扩展,所以现在使用起来会觉得不是很方便。它的作者是 Kenneth Almquist,在 1989 年开发完成,90 年代初在 BSD 版本的 Unix 上替代 Bourne Shell,成为默认的 shell。目前 BSD 衍生版本的 Unix(如 NetBSD、DragonFly BSD、MINIX 等)上仍然是默认的 Shell。Android 在 4.0 以下使用 ash 作为默认的 shell,之后换成了 mksh。 具体演变点击这里查看。

    Almquist shell 演化图
    Almquist shell 演化图

    修正:BSD 不能算是 Linux,算是 Unix 的开源版本,其衍生版本 OpenBSD、NetBSD 等也算是 Unix,感谢网友提示。

  7. dash 全称叫 the Debian Almquist Shell,是 Debian 驱动的一个 ash(Almquist shell)的衍生版本,因为 Debian 衍生出来的 Linux(如 Ubuntu)把它作为默认的 shell,所以才成为一个影响力比较大的 shell 种类。

  8. bash 全称叫 Bourne Again Shell,作者是 Brian Fox,在 1989 年开发完成。它是 sh(Bourne Shell)的增强版本,GNU 工程的一部分,用来替代 Bourne shell。它用于基于 GNU 的系统,如大多数的 Linux(Red Hat、Slackware、Caldera)都以 bash 作为缺省的 shell,并且运行 sh 时,其实调用的是 bash。OS X 也把它作为默认的 shell,Windows 也可以通过 Cygwin 或者 MinGW 来支持。

  9. zsh 全称叫 Z Shell,作者 Paul Falstad 在 1990 年还是普林斯顿大学的学生时写了 zsh 的第一个版本。zsh 名字来源于耶鲁大学教授 Zhong Shao,那个时候 Zhong Shao 还是普林斯顿大学的助理教授。 zsh 是在 Bourne shell 的基础上扩展出来的,经历了大量的改进后,又引入了 bash、ksh 和 tcsh 的新特性,而且它是开源的,很多人都在推崇它,甚至有人说它是终极 Shell

  10. cmd Windows 下的命令行工具。

  11. PowerShell 也是 Windows 下面的命令行工具,支持 .NET Framework 技术。

目前各主要操作系统下缺省的 Shell

操作系统默认 Shell
AIXksh
Oracle Solarisrsh(sh 的限制版本)
FreeBSDcsh
Linux(大部分)bash
Macbash
Windowscmd & PowerShell
Android 4.0 以下ash
Android 4.0 及以上mksh

所以如果想要学习 shell 脚本,应该学 bash。而且在 Windows 上面可以通过 Cygwin 或者 MinGW 来支持 bash。

参考:http://c.biancheng.net/cpp/view/6995.html