Unix Shell


Unix Shell是一种外壳与命令行界面,系UNIX操作系统下传统的用户和计算机的交互界面。第一个用户直接输入命令来执行各种各样的任务。“Shell”的名字和概念是从Unix的前身Multics发展过来的,应用程序通过shell来进行调用并被系统执行。
普通意义上的shell就是可以接受用户输入命令的程序。它之所以被称作shell是因为它隐藏了操作系统低层的细节。同样的Unix下的图形用户界面GNOME和KDE等桌面环境,有时也被叫做“虚拟shell”或“图形shell”。
Unix操作系统下的shell既是用户交互的界面,也是控制系统的脚本语言。在这点上有别于Windows下的命令行,虽然也提供了很简单的控制语句。在Windows操作系统下,可能有些用户从来都不会直接的使用shell,然而在Unix系列操作系统下,shell仍然是控制系统启动、视窗系统启动和很多其他实用工具的脚本解释程序。
各种Unix shell
第一个Unix shell是由肯·汤普逊,仿效Multics上的shell所实现出来,称为sh。
Bourne shell兼容
Bourne shell(sh)史蒂夫·伯恩在贝尔实验室时编写。1978年随Version 7 Unix首次发布。多数系统Unix/Linux系统的/bin/sh,是事实意义上的sh;下文还会其介绍。
Almquist shell(ash)
Bourne-Again shell(bash)
Debian Almquist shell(dash)
Korn shell(ksh)由David Korn在贝尔实验室时编写。
Z shell(zsh)
C shell兼容
C shell(csh)比尔·乔伊在加州大学伯克利分校时编写。1979年随BSD首次发布。
TENEX C shell(tcsh)
其他
fish,第一次发布于2005年。
rc shell(rc)九号项目系统的shell,由Tom Duff在贝尔实验室时编写。随后移植回Unix和其他的操作系统。
es shell(es)一个函数式编程的rc兼容shell,编写于二十世纪九十年代中期。
scsh(Scheme Shell)
仅存于历史的shell
Thompson shell(sh)第一个Unix shell,由肯·汤普逊在贝尔实验室时编写。1971年至1975年随Unix第一版至第六版发布。
PWB shell(sh)Thompson shell的一个版本,由John Mashey和他人在贝尔实验室时改进。1976年随PWB UNIX发布。
Bourne shell
Bourne shell(伯恩壳),或sh,是Version 7 Unix默认的Unix shell,替代执行文件同为sh的Thompson shell。它由AT&T贝尔实验室的史蒂夫·伯恩在1977年左右在Version 7 Unix中针对大学与学院发布的。它的二进制程序文件在大多数Unix系统上位于/bin/sh,在很多Unix版本中,它仍然是root的默认shell。首发于1979年。
其concise(简洁),compact(紧凑),fast(高效)是非常适合系统管理shell。
Almquist shell(ash)
经常被简称为 A Shell 或 ash,一种Unix shell,源自于Bourne shell,由肯尼斯·艾昆斯特(Kenneth Almquist)在SVR4上建立了这个分支,并于1989年5月下旬始发。它的特色是快而且轻巧,兼容于POSIX,在后来的BSD版本上,它取代了Bourne shell。
在FreeBSD、NetBSD、DragonFly BSD、Minix上,预设安装的shell(/bin/sh) ,都是衍生自 ash。在Linux上,发展出了 Debian Almquist shell。
Debian Almquist shell(dash)
缩写为dash,一种 Unix shell,兼容于POSIX标准。比 Bash 小,只需要较少的磁盘空间,但是它的功能也较少。它由 NetBSD 版本的Almquist shell (ash)发展而来,于1997年7月由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。
Dash 类似于 ash,其执行 shell scripts 的速度比bash快,依赖库也较少。
KornShell(ksh)
由大卫·科恩于二十世纪八十年代早期在贝尔实验室开发的Unix shell,并在1983年7月14日的USENIX年度技术会议上发布。起初此软件基于Bourne shell的源代码编写。其他贡献者有贝尔实验室的开发者,如迈克·维奇(Mike Veach)和帕特·沙利文(Pat Sullivan);他们分别编写了Emacs和vi风格的行编辑模式代码。其向后兼容Bourne shell,同时还根据贝尔实验室用户的需求添加了诸多C shell的功能。

KornShell实现了POSIX.2,同时拥有壳层及实用工具、命令解释器(IEEE Std 1003.2-1992.)。与传统的Bourne shell的主要差别有:
根据C shell所设计的作业控制、命令别名及命令历史特性。作业控制功能于1989年才添加至Bourne Shell。
提供基于vi、Emacs和XEmacs的三种命令行编辑风格。
关联数组及内置的浮点运算操作(仅在ksh93版KornShell中可用)。
内置指令的动态可扩展(截至ksh93版本)。
KornShell起初是一款专有软件。在2000年,其源代码以AT&T独有的许可发布;但在2005年年初,93q版本使用Eclipse公共许可证发布。由于KornShell起初为私有授权软件,在当时的人们创造了自由开源的替代品(pdksh、mksh、GNU bash及zsh)。KornShell被收录进了AT&T软件技术(AST)开源软件集。
KornShell的原始版本(ksh88)被当做POSIX.2、壳层及实用工具、命令解释器(IEEE Std 1003.2-1992.)的基础。
部分供应商有时会提供其自己根据老版本ksh88改编的变体,有时还会在其基础上添加扩展。ksh93现仍被作者维护,并通过在其后添加字母的方式命名发布版本;截至2017年1月16日的最新版本为ksh93u+(ksh93u及ksh93t+的更新版);ksh93v仍处于测试阶段(截至2017年1月)。
作为“桌面版KornShell”(dtksh),ksh93作为通用桌面环境的一部分发布。此版本同时提供了对Motif挂件的壳层级映射。它的目的是成为Tcl/Tk的竞争对手。
原版KornShell(ksh88)成为了AIX第四版的默认壳层,但同时也可使用ksh93。
UnixWare 7中既包括ksh88,也包括ksh93。默认的Kornshell版本为ksh93(/usr/bin/ksh),老版本则在/usr/bin/ksh88下可用。UnixWare同时在安装了CDE的情况下提供{{mono|dtksh}。
OpenBSD下的ksh(rksh,pd ksh)则是公有领域的KornShell。由于上述原因,基于其派生了不少分支产品(各使用了较为开放的授权协议):
dtksh – ksh93的分支,为CDE的一部分;Eclipse公共许可证,部分使用LGPL。
tksh – ksh93的分支,提供对Tk部件工具箱的访问。
oksh – OpenBSD风味KornShell的Linux版分支,为DeLi Linux的默认壳层。
pdksh - 公有领域,含部分类ISC代码。
mksh – KornShell语言的自由软件实现,为pdksh的分支。其起初为MirOS BSD开发,以宽松的授权条款发布(MirOS许可证)。除了用在BSD上外,此变体还替代了Debian上的pdksh,更是Android的默认壳层。
SKsh – AmigaOS风味的版本,提供了多个Amiga的特有功能(如ARexx互用性)
MKS Inc.的MKS Korn shell – 来自用于UNIX的微软Windows服务(SFU)对KornShell语言的专有实现(版本2.0及以下);据大卫·科恩所述,MKS Korn shell与1998年时的Kornshell不完全兼容。在SFU版本3.0中,微软使用Interix中的POSIX.2兼容版壳层替换了MKS Korn shell。
大卫·科恩的Unix兼容包UWIN中含有KornShell。
Z shell(Zsh)
一款可用作交互式登录的shell及脚本编写的命令解释器,它对Bourne shell做出了大量改进,同时加入了Bash、ksh及tcsh的某些功能。由保罗·弗斯塔德(Paul Falstad)于1990年在普林斯顿大学求学时编写了Zsh的初版,其名称源于耶鲁大学教授邵中(Zhong Shao,后转为普林斯顿大学教授) — 保罗将教授的用户名"zsh"作为此Shell的名称。采用MIT协议授权。

2019年时,在MacOS上由于Bash的版本已经很旧(v3.2.57),而新版本的Bash v5改采GPLv3授权,这是Apple公司无法接受的。于是自当时起,macOS的默认Shell已从Bash改为Zsh。
Kali Linux也使用zsh作为默认shell。用户社区网站"Oh My Zsh"收集Z shell的第三方插件及主题。同时也带有更新已安装插件及主题的自动更新工具。
特性:
可帮助用户键入常用命令选项及参数的可编程命令行补全功能,自带对数百条命令的支持
可与任意Shell共享命令行历史记录
可在无需运行外部程序(如find)的情况下通过文件扩展匹配文件
改进变量/数组处理方式
在单缓冲区内编辑多行命令与拼写检查
多种兼容模式(例如,Zsh可在运行为/bin/sh的情况下伪装成Bourne shell)
可编程的命令行界面,包括将提示行信息显示在屏幕右侧并在输入过长指令时自动隐藏的功能
可加载模块可提供额外支持:完整传输控制协议、Unix域套接字控制、FTP客户端及扩展数学函数。
自带where命令,其与which命令类似,但是显示指定于$PATH中所指定指令的全部位置,而不是仅显示所使用指令的位置。
目录名称。此功能可让用户设置快捷方式,(如~mydir,与~及~user的工作方式相似)。
Thompson shell
这是历史上第一个Unix shell,1971年由肯·汤普逊写作出第一版并加入UNIX之中。它是一个简单的命令行解释器,但不能被用来执行指令稿(Shell script)。它的许多特征影响了以后命令行界面的发展。至Version 7 Unix之后,被Bourne shell取代。它所使用的重导向命令“<”与“>”,以及流水线命令“|”影响到之后的Unix shell与MS DOS,绝大多数Unix shell和其他系统的命令行(包括DOS、OS/2、Windows等)都支持这三个符号。
Thompson shell设计之初就为输入和输出重定向设计了简单的语法。在设计Multics系统时,输入输出的重定向需要用特别的命令来表示重定向开始和重定向结束,而在Unix系统中,用户只需要简单地在命令后面附加一个“<”或“>”符号,再附上文件名,shell就可以在执行命令时处理输入或输出重定向。在1971年Unix发布第一个版本时,这个语法就已经被实现了。后来又加入了管道的功能。在道格拉斯·麦克罗伊的建议下,重定向的功能被扩展,这样一条命令的输出就可以用作另一条命令的输入。
Thompson shell是按照极简主义进行设计的,语法非常简单,即使是不太复杂的“if”和“goto”也需要多条命令来实现。在1975年Version 6 Unix发布之际,这个shell已经无法满足大多数编程任务的需要。这时,PWB/UNIX的开发者,特别是约翰·马沙开始修改Thompson shell的源代码,使其更适合编程。修改之后的shell被称为PWB shell或Mashey shell,包括了高级的控制流,并引入了变量,但新功能也有所限制,以保证与Thompson shell的兼容性。
最终在1978年,Version 7 Unix已经把默认的shell换成了Bourne shell,而1979年时2BSD把默认shell换成了C shell。因为所有现代Unix系统和类Unix系统都是从Version 7 Unix和2BSD继承而来,所以Thompson shell基本上已经不再被使用。但Thompson shell作为Ancient UNIX系统的一部分,并且开放源代码,它也被移植到了现代Unix系统中,作为历史展览而出现。
普通意义上的shell就是可以接受用户输入命令的程序。它之所以被称作shell是因为它隐藏了操作系统低层的细节。同样的Unix下的图形用户界面GNOME和KDE等桌面环境,有时也被叫做“虚拟shell”或“图形shell”。
Unix操作系统下的shell既是用户交互的界面,也是控制系统的脚本语言。在这点上有别于Windows下的命令行,虽然也提供了很简单的控制语句。在Windows操作系统下,可能有些用户从来都不会直接的使用shell,然而在Unix系列操作系统下,shell仍然是控制系统启动、视窗系统启动和很多其他实用工具的脚本解释程序。
各种Unix shell
第一个Unix shell是由肯·汤普逊,仿效Multics上的shell所实现出来,称为sh。
Bourne shell兼容
Bourne shell(sh)史蒂夫·伯恩在贝尔实验室时编写。1978年随Version 7 Unix首次发布。多数系统Unix/Linux系统的/bin/sh,是事实意义上的sh;下文还会其介绍。
Almquist shell(ash)
Bourne-Again shell(bash)
Debian Almquist shell(dash)
Korn shell(ksh)由David Korn在贝尔实验室时编写。
Z shell(zsh)
C shell兼容
C shell(csh)比尔·乔伊在加州大学伯克利分校时编写。1979年随BSD首次发布。
TENEX C shell(tcsh)
其他
fish,第一次发布于2005年。
rc shell(rc)九号项目系统的shell,由Tom Duff在贝尔实验室时编写。随后移植回Unix和其他的操作系统。
es shell(es)一个函数式编程的rc兼容shell,编写于二十世纪九十年代中期。
scsh(Scheme Shell)
仅存于历史的shell
Thompson shell(sh)第一个Unix shell,由肯·汤普逊在贝尔实验室时编写。1971年至1975年随Unix第一版至第六版发布。
PWB shell(sh)Thompson shell的一个版本,由John Mashey和他人在贝尔实验室时改进。1976年随PWB UNIX发布。
Bourne shell
Bourne shell(伯恩壳),或sh,是Version 7 Unix默认的Unix shell,替代执行文件同为sh的Thompson shell。它由AT&T贝尔实验室的史蒂夫·伯恩在1977年左右在Version 7 Unix中针对大学与学院发布的。它的二进制程序文件在大多数Unix系统上位于/bin/sh,在很多Unix版本中,它仍然是root的默认shell。首发于1979年。
其concise(简洁),compact(紧凑),fast(高效)是非常适合系统管理shell。
Almquist shell(ash)
经常被简称为 A Shell 或 ash,一种Unix shell,源自于Bourne shell,由肯尼斯·艾昆斯特(Kenneth Almquist)在SVR4上建立了这个分支,并于1989年5月下旬始发。它的特色是快而且轻巧,兼容于POSIX,在后来的BSD版本上,它取代了Bourne shell。
在FreeBSD、NetBSD、DragonFly BSD、Minix上,预设安装的shell(/bin/sh) ,都是衍生自 ash。在Linux上,发展出了 Debian Almquist shell。
Debian Almquist shell(dash)
缩写为dash,一种 Unix shell,兼容于POSIX标准。比 Bash 小,只需要较少的磁盘空间,但是它的功能也较少。它由 NetBSD 版本的Almquist shell (ash)发展而来,于1997年7月由赫伯特·许(Herbert Xu)移植到Linux上,于2002年改名为 dash。
Dash 类似于 ash,其执行 shell scripts 的速度比bash快,依赖库也较少。
KornShell(ksh)
由大卫·科恩于二十世纪八十年代早期在贝尔实验室开发的Unix shell,并在1983年7月14日的USENIX年度技术会议上发布。起初此软件基于Bourne shell的源代码编写。其他贡献者有贝尔实验室的开发者,如迈克·维奇(Mike Veach)和帕特·沙利文(Pat Sullivan);他们分别编写了Emacs和vi风格的行编辑模式代码。其向后兼容Bourne shell,同时还根据贝尔实验室用户的需求添加了诸多C shell的功能。

KornShell实现了POSIX.2,同时拥有壳层及实用工具、命令解释器(IEEE Std 1003.2-1992.)。与传统的Bourne shell的主要差别有:
根据C shell所设计的作业控制、命令别名及命令历史特性。作业控制功能于1989年才添加至Bourne Shell。
提供基于vi、Emacs和XEmacs的三种命令行编辑风格。
关联数组及内置的浮点运算操作(仅在ksh93版KornShell中可用)。
内置指令的动态可扩展(截至ksh93版本)。
KornShell起初是一款专有软件。在2000年,其源代码以AT&T独有的许可发布;但在2005年年初,93q版本使用Eclipse公共许可证发布。由于KornShell起初为私有授权软件,在当时的人们创造了自由开源的替代品(pdksh、mksh、GNU bash及zsh)。KornShell被收录进了AT&T软件技术(AST)开源软件集。
KornShell的原始版本(ksh88)被当做POSIX.2、壳层及实用工具、命令解释器(IEEE Std 1003.2-1992.)的基础。
部分供应商有时会提供其自己根据老版本ksh88改编的变体,有时还会在其基础上添加扩展。ksh93现仍被作者维护,并通过在其后添加字母的方式命名发布版本;截至2017年1月16日的最新版本为ksh93u+(ksh93u及ksh93t+的更新版);ksh93v仍处于测试阶段(截至2017年1月)。
作为“桌面版KornShell”(dtksh),ksh93作为通用桌面环境的一部分发布。此版本同时提供了对Motif挂件的壳层级映射。它的目的是成为Tcl/Tk的竞争对手。
原版KornShell(ksh88)成为了AIX第四版的默认壳层,但同时也可使用ksh93。
UnixWare 7中既包括ksh88,也包括ksh93。默认的Kornshell版本为ksh93(/usr/bin/ksh),老版本则在/usr/bin/ksh88下可用。UnixWare同时在安装了CDE的情况下提供{{mono|dtksh}。
OpenBSD下的ksh(rksh,pd ksh)则是公有领域的KornShell。由于上述原因,基于其派生了不少分支产品(各使用了较为开放的授权协议):
dtksh – ksh93的分支,为CDE的一部分;Eclipse公共许可证,部分使用LGPL。
tksh – ksh93的分支,提供对Tk部件工具箱的访问。
oksh – OpenBSD风味KornShell的Linux版分支,为DeLi Linux的默认壳层。
pdksh - 公有领域,含部分类ISC代码。
mksh – KornShell语言的自由软件实现,为pdksh的分支。其起初为MirOS BSD开发,以宽松的授权条款发布(MirOS许可证)。除了用在BSD上外,此变体还替代了Debian上的pdksh,更是Android的默认壳层。
SKsh – AmigaOS风味的版本,提供了多个Amiga的特有功能(如ARexx互用性)
MKS Inc.的MKS Korn shell – 来自用于UNIX的微软Windows服务(SFU)对KornShell语言的专有实现(版本2.0及以下);据大卫·科恩所述,MKS Korn shell与1998年时的Kornshell不完全兼容。在SFU版本3.0中,微软使用Interix中的POSIX.2兼容版壳层替换了MKS Korn shell。
大卫·科恩的Unix兼容包UWIN中含有KornShell。
Z shell(Zsh)
一款可用作交互式登录的shell及脚本编写的命令解释器,它对Bourne shell做出了大量改进,同时加入了Bash、ksh及tcsh的某些功能。由保罗·弗斯塔德(Paul Falstad)于1990年在普林斯顿大学求学时编写了Zsh的初版,其名称源于耶鲁大学教授邵中(Zhong Shao,后转为普林斯顿大学教授) — 保罗将教授的用户名"zsh"作为此Shell的名称。采用MIT协议授权。

2019年时,在MacOS上由于Bash的版本已经很旧(v3.2.57),而新版本的Bash v5改采GPLv3授权,这是Apple公司无法接受的。于是自当时起,macOS的默认Shell已从Bash改为Zsh。
Kali Linux也使用zsh作为默认shell。用户社区网站"Oh My Zsh"收集Z shell的第三方插件及主题。同时也带有更新已安装插件及主题的自动更新工具。
特性:
可帮助用户键入常用命令选项及参数的可编程命令行补全功能,自带对数百条命令的支持
可与任意Shell共享命令行历史记录
可在无需运行外部程序(如find)的情况下通过文件扩展匹配文件
改进变量/数组处理方式
在单缓冲区内编辑多行命令与拼写检查
多种兼容模式(例如,Zsh可在运行为/bin/sh的情况下伪装成Bourne shell)
可编程的命令行界面,包括将提示行信息显示在屏幕右侧并在输入过长指令时自动隐藏的功能
可加载模块可提供额外支持:完整传输控制协议、Unix域套接字控制、FTP客户端及扩展数学函数。
自带where命令,其与which命令类似,但是显示指定于$PATH中所指定指令的全部位置,而不是仅显示所使用指令的位置。
目录名称。此功能可让用户设置快捷方式,(如~mydir,与~及~user的工作方式相似)。
Thompson shell
这是历史上第一个Unix shell,1971年由肯·汤普逊写作出第一版并加入UNIX之中。它是一个简单的命令行解释器,但不能被用来执行指令稿(Shell script)。它的许多特征影响了以后命令行界面的发展。至Version 7 Unix之后,被Bourne shell取代。它所使用的重导向命令“<”与“>”,以及流水线命令“|”影响到之后的Unix shell与MS DOS,绝大多数Unix shell和其他系统的命令行(包括DOS、OS/2、Windows等)都支持这三个符号。
Thompson shell设计之初就为输入和输出重定向设计了简单的语法。在设计Multics系统时,输入输出的重定向需要用特别的命令来表示重定向开始和重定向结束,而在Unix系统中,用户只需要简单地在命令后面附加一个“<”或“>”符号,再附上文件名,shell就可以在执行命令时处理输入或输出重定向。在1971年Unix发布第一个版本时,这个语法就已经被实现了。后来又加入了管道的功能。在道格拉斯·麦克罗伊的建议下,重定向的功能被扩展,这样一条命令的输出就可以用作另一条命令的输入。
Thompson shell是按照极简主义进行设计的,语法非常简单,即使是不太复杂的“if”和“goto”也需要多条命令来实现。在1975年Version 6 Unix发布之际,这个shell已经无法满足大多数编程任务的需要。这时,PWB/UNIX的开发者,特别是约翰·马沙开始修改Thompson shell的源代码,使其更适合编程。修改之后的shell被称为PWB shell或Mashey shell,包括了高级的控制流,并引入了变量,但新功能也有所限制,以保证与Thompson shell的兼容性。
最终在1978年,Version 7 Unix已经把默认的shell换成了Bourne shell,而1979年时2BSD把默认shell换成了C shell。因为所有现代Unix系统和类Unix系统都是从Version 7 Unix和2BSD继承而来,所以Thompson shell基本上已经不再被使用。但Thompson shell作为Ancient UNIX系统的一部分,并且开放源代码,它也被移植到了现代Unix系统中,作为历史展览而出现。