UNIX市场的分裂有其优点也有缺点。优点主要来自UNIX出现的早期:缺乏标准和在技术性学院和专业人员中的过度发展导致出现了UNIX软件的健康“免费市场”。在该市场内,同一类型的几个程序(例如:shell、文本编辑器、系统管理工具)都可能会流行。最好的程序通常也是最流行的,而较差的就会消失。
但常常在一给定范围内没有单一的“最好”的程序,可能会有几个同时在流行。这就出现了现在的情况,类似软件的多样性导致了混乱、兼容性的缺乏以及UNIX无法像其他操作平台(MS-DOS、Microsoft Windows、Novell Netware等)那样形成巨大的共享市场。
shell的这种情况比其他类型软件要严重得多。像在前言和第一章中所说的,当前有几个可用shell,它们之间的差别并不大。
因此这里有必要介绍一下与bash类似的shell。本附录总结了它们和bash之间的差别。如下:
·Bourne shell标准版本7,是所有shell的基础。
·IEEE POSIX 1003.2 shell,是bash和其他shell将要遵守的标准。
·Korn shell (ksh),是许多UNIX系统都提供的一种商业shell。
·pdksh,一种广泛使用的公用域的Korn shell。
·桌面PC平台上的通用型shell,包括MKS Toolkit shell。
**Bourne shell
bash对Bourne shell几乎是完全向后兼容的。bash对后者唯一不支持的重要特性是将^符号作为管道符(|)的同义词。这是Bourne shell为和早期shell保持向后兼容而包含的过时特性。现在没有任何UNIX版本使用^符号作为管道。
为描述Bourne shell和bash之间的差别,我们将遍历本书的各章,并在下面列举出其中讨论的Bourne shell不支持的特性。虽然也存在一些支持某些bash特性的Bourne shell版本,但这里主要指的是已发布好多年的Bourne shell标准版本7。
第一章 bash基础
cd命令的cd - 格式;~符号扩展;jobs命令;help内置命令。
第二章 命令行编辑
全部(也就是说,Bourne shell不支持本章讨论的任何readline、历史和编辑特性)。
第三章 定制用户环境
别名;提示字符串定制;set选项。Bourne shell只支持下面的:-e、-k、-n、-t、-u、-v、-x和-。它不支持选项名(-o)。shopt内置;也不支持环境文件。
它不支持下列内置变量:
BASH BASH_VERSION
BASH_ENV BASH_VERSINFO
CDPATH DIRSTACK
FCEDIT GROUPS
HISTCMD HISTCONTROL
HISTFILE HISTIGNORE
HISTSIZE HISTFILESIZE
HOSTFILE HOSTNAME
HOSTTYPE IGNOREEOF
INPUTRC LANG
LC_ALL LC_COLLATE
LC_MESSAGES LINENO
MAILCHECK OLDPWD
OPTARG OPTERR
OPTIND OSTYPE
PROMPT_COMMAND PIPESTATUS
PS3 PS4
PWD RANDOM
REPLY SECONDS
SHELLOPTS SHLVL
TIMEFORMAT TMOUT
auto_resume histchars
第四章 基础shell编程
函数;type命令;local命令;${#parameter}操作符;模式匹配变量操作符(%,%%,#,##);命令替换语法也不同:使用老式的`command`而不是$(command);内置pushd和popd命令。
第五章 流程控制
!关键字;也不支持select结构;当使用点号(.)source时,Bourne shell的return并不退出脚本。
第六章 命令行选项和有类型变量
使用外部命令getopt而不是getopts。但要注意它实际上执行的功能并不相同。不支持整数运算。使用外部命令expr而不是$((arithmetic-exp))语法。也不支持算术条件运算((arithmetic-exp));使用老式的条件测试语法和关系操作符,如-lt,-eq等。不支持数组变量;也不支持declare和let。
第七章 输入/输出和命令行处理
command、builtin和enable内置命令。不支持echo的-e和-E选项;不支持I/O重定向符>|和<>。不支持read的任何选项。
第八章 进程处理
作业控制——特别是jobs、fg和bg命令。不支持用%标记作业编号,即kill和wait命令只接受继承进程ID。trap的-选项(重新设置trap为信号的默认值);trap只接受信号号码,而不是逻辑名。disown内置命令。
第九章 调试shell程序
不支持DEBUG伪信号;支持EXIT伪信号,将其作为信号0。
第十章 bash管理
不支持ulimit命令和特权模式。不支持umask的-S选项。Bourne shell的受限副本rsh,只限制对PATH赋值。
**IEEE 1003.2 POSIX Shell标准
以前有许多试图标准化UNIX的尝试。硬件厂家在市场领域统一的尝试、脆弱的工业结合、市场失败以及其他各种努力都曾出现过,最终都以失败告终。
唯一被标准化,但还没有引起商业兴趣的是:可移植操作系统接口,亦即POSIX。该标准化过程始于1981年的/usr/group(现在为UniForum)标准化组织,它3年后推出了/usr/group Standard。后来该组织不断扩大,电气和电子工程师协会(IEEE)和国际标准化组织(ISO)也参与进来。
第一个POSIX标准发布于1988年,称为IEEE P1003.1。它包括了所有系统调用级的底层问题。IEEE P1003.2包括了shell、实用程序和用户接口问题,经过6年努力它发布于1992年。
POSIX标准从来不是严格的和绝对的。协会成员当然也不会强迫操作系统厂商必须符合他们的标准。标准设计的非常灵活,允许相似可用软件存在,这样已有的代码才不会荒废,并可以加入新的特性,这也是厂家不断进行改革的动力源泉。换句话说,它们被看作是一种厂家可能会感兴趣并遵从的第三方标准。
结果是,当前大多数UNIX厂家都遵守POSIX 1003.1标准。现在POSIX 1003.2已经出台,大多数重要的shell毫无疑问都将会遵守它,bash也不例外;它几乎是100%与POSIX一致的,并会在将来版本中朝着完全一致迈进。
POSIX 1003.2本身有两部分。第一部分是1003.2,规定了shell脚本的灵活性,它定义了shell和标准实用程序。第二部分是1003.2a,被称为用户可移动性扩展(UPE),定义了交互式shell使用的标准,以及类似vi编辑器的交互式工具。两个文档加起来大约2000页,均可通过IEEE得到,请打电话给(800) 678-IEEE了解信息。
协会成员在设计1003.2 shell标准时有两个主要考虑的因素。一方面,设计必须尽可能适应已存在的在各种Bourne变体的shell(版本7、系统V、BSD和Korn shell)下编写的shell代码。这些shell在一些细微的地方有些不同,主要是语法元素之间相互作用的方式不同。
要区分开这些差别很困难,也很令人头疼。最好采取一种折中的态度。由于某些协会成员对特定shell的偏见,因此花费6年时间才发布了1003.2。
从另一方面看,shell设计必须作为一种将来shell实现的标准。这就要求设计必须简单化、清晰和精确——这一事实在上述问题的上下文看起来不好理解。
设计者找到了一种解决困境的方法:他们决定标准不但应包含shell中已有的特性,还要包含那些明显遗漏的特性以及已包含但未指名功能的特性。这个策略允许一些现有的shell加入还没有成为标准的创新,同时列出遗漏的特性,有助于程序员判断哪些已有shell脚本中的特性在将来的shell是不可移植的。
POSIX标准基本上基于系统V Bourne shell,后者是版本7的一个超集,在本附录前面曾讨论过。因此,可以假定未出现在Bourne shell中的bash特性也不应该被包含在POSIX标准内。
下列bash特性有些未在标准中指定,有些语法可接受,但其功能未标准化:
·支持第四章介绍过的函数的其他语法;后面将讨论。
·select控制结构。
·支持代码块({...}),但为方便起见,大括号应被引起来(具体原因太复杂)。
·如果某特定键信号(INT、TERM和其他)与UNIX大部分重要的历史版本相同,该信号编号才被允许。通常,shell脚本应对信号使用同义名。
POSIX标准支持函数,但语义要弱一些。不能定义局部变量并且函数不能被导出。
命令查找次序也被修改以允许某些内置命令被函数覆盖——因为别名未包含在标准中。内置命令按其在命令查找次序中的位置被分成两个子集:一些在函数前处理,一些在其后。特别是,内置命令break、:(执行空操作)、continue、.(source)、eval、exec、exit、export、readonly、return、set、shift、trap和unset的优先级都比函数要高。
最后,因为POSIX标准增强了shell脚本的可移植性,它避免了只可应用于交互式shell的特性的出现,包括别名、编辑模式、控制键等。UPE包括这些内容。它也避免了一些基本的实现问题,特别是不需要对后台作业、子shell等使用多任务。这使移植到类似MS-DOS的非多任务系统成为可能。例如,MKS Toolkit(见下面讨论)可为POSIX兼容。
**Korn shell
第一个主要的传统shell(Bourne和C)的替代品之一是Korn shell,它1986年作为AT&T的“试验性工具”的一部分发布。Korn shell由AT&T的David Korn编写。第一版没有被支持。但最后UNIX系统试验室(USL)1989年发布UNIX(系统V版本4)时决定支持它。1988年11月,Korn shell成为最广泛使用的shell版本。
1988年的发布版本还不是完全POSIX一致的——这一点比bash要差。最近的版本(1993年)使Korn shell的一致性得到了改善,它提供了更多的特性,并对已存在的特性进行了优化处理。
与bash不同,Korn shell是一个商业产品;其源代码不可获得,你必须够买可执行软件(一般捆绑在大多数商业UNIX版本中其他实用程序内)。
1988年的KOrn shell和bash共享了许多特性,但在Korn shell中还有些重要的差别:
·函数更类似于单独的实体,而不是调用shell的一部分(中断和选项对调用shell不共享)。
·支持协同程序。两个进程可使用print和read命令互相通信。
·命令print替换了echo。print可具有指定的文件描述符,可被用于互相通信。
·支持函数自动载入。函数只有被调用时才被读到内存中。
·字符串条件测试有了新语法形式[[...]]。
·有另外的“伪”信号,ERR。当脚本或函数以非0状态退出时发送该信号。
·支持一维数组,但限定元素数最大为1024。
·通过对模式匹配和包含正则表达式操作符的扩展大幅增强了文件名生成能力。
·历史列表被保存在一个文件中而不是内存中,这样就允许shell的并发实例访问相同的历史列表,在某些环境下会带来一些好处。
·没有默认的启动文件,如果环境变量ENV未定义,则不读任何值。
·type命令被更严格的whence替代。
·基本提示符(PS1)不允许出现被转义的命令。
·没有builtin、command和enable的内置等价命令。
·不提供键绑定和与readline直接等价的命令。
·没有内置的pushd、popd和dirs的内置等价命令。如果要使用它们,必须将其定义为函数。
·不支持历史替换机制。
·在默认配制中不支持大括号,但是作为编译时的选项。
·!不是关键字。
·提示符字符串不允许反斜线转义特殊字符。
·不提供在线帮助。
·不存在如下bash环境变量:
BASH BASH_VERSION
BASH_VERSINFO DIRSTACK
EUID FIGNORE
GLOBIGNORE HISTCMD
HISTFILESIZE HISTIGNORE
HISTCONTROL HOSTFILE
HOSTNAME HOSTTYPE
IGNOREEOF INPUTRC
MACHTYPE OPTERR
OSTYPE PROMPT_COMMAND
PIPESTATUS SHELLOPTS
SHLVL TIMEFORMAT
UID auto_resume
histchars
另外,Korn的启动和环境文件也有所不同,它由.profile和ENV变量指定的文件组成。默认环境文件可使用变量ENV覆盖。没有注销文件。
bash同1988年的Korn shell以及1993年的Korn shell的详细差别请见bash包的doc目录下的FAQ文件。
Korn shell是bash的一个很好的替代品。它最主要缺点是不能免费利用,每隔几年就要升级。
**pdksh
bash的免费可替代产品是称为pdksh的Korn shell版本(表示公用域的Korn shell)。可在Internet上得到pdksh源代码,例如USENET新闻组comp.sources.unix和pdksh的万维网主页(http://www.cs.mun.ca/~michael/pdksh/),其当前维护者是Michael Rendell。
pdksh最初由Eric Gisin编写。他是在Charles Forsyth的Bourne shell公用域版本7基础上编写的。它包含了Bourne shell的所有特性,又加上了POSIX的扩展和一些自身特性。
pdksh的额外特性包括用户定义的~标记,可以使用它将~创建为任意内容的缩写,不只是用户名。
另外,pdksh缺乏官方Korn版本和bash的一些特性。特别是以下bash特性:
·内置变量PS4。
·高级I/O重定向符>|和<>。
·选项errexit、noclobber和privileged。
与bash相比,pdksh的一个重要优点是其可执行文件代码量较小,执行速度更快。但相应的缺点是与POSIX的兼容性较差,有许多人都对该shell增加了代码(因此它不像bash那样控制严格),同时它也并没有像bash一样作为成熟产品发布(例如,其文档还不够详细和完整)。
然而,pdksh是要寻找不同于bash的shell,但又不能获得Korn shell时一个很好的替代品。
**PC平台上的软件通用型shell
shell的发展并没有在UNIX领域止步。许多最初在UNIX系统上获得经验,后来又跨越到PC世界的程序员都希望有一个好的类UNIX环境(特别是面对MS-DOS命令行的悲惨环境时),因此,自然就出现了小型机操作系统上的UNIX shell风格的接口,它们模拟了Bourne shell的风格。
Korn shell软件通用型shell在MKS中给出,可从Mortice Kern Systems处获得。该工具集实际上是一个针对MS-DOS(2.0以后版本)和OS/2(1.2以后版本)的完整的类UNIX环境。除了shell,它还带有一个vi编辑器和许多UNIX风格的实用程序,主要包括如awk、uucp和make。
MKS shell本身与1988年的UNIX Korn shell兼容性很好,而且具有完整的手册。
在MKS shell和Korn shell、bash之间的主要差别在于底层操作系统的限制而不是shell本身。最关键的是,MS-DOS不支持多任务或文件权限,因此MS-DOS版本不支持相关特性。OS/2版本也不支持文件权限。
如果你要知道1988年的Korn shell和MKS shell之间差别的详细内容,可以参阅O'Reilly & Associates技术手册,系列中由Bill Rosenblatt所著的《Learning the Korn Shell》中的附录A。
许多转移到DOS PC的UNIX用户很信赖MKS Toolkit。它是很便宜的,而且使得MS-DOS成为高级用户和软件开发者一种可选的环境。
该工具集可通过软件工具售卖商或MKS自身得到。要了解详细信息请联系:
MKS
185 Columbia Street West
Waterloo, Ontario, Canada N2L 5Z5
或以电子方式联系:
Telephone (800) 265-2797 (US & Canada)
Fax (519) 884 8861
Internet info@mks.com
CompuServe 73260,1043
BIX mks
WWW http://www.mks.com/
学习bash第二版-附录一 相关shell
最新推荐文章于 2018-08-14 11:31:20 发布