从表单系统到通用命令语言
Korn shell通常简称ksh,是大卫·科恩在美国贝尔实验室发展的一种Unix命令解释器和脚本语言。它以Bourne shell为基础,既让用户交互地启动程序,也能把重复操作组织成可保存的脚本。
科恩1994年的论文追溯了一个表单录入项目:团队修改Bourne shell,让表单模板产生变量,再把变量输出到屏幕表格。let命令处理算术,数组保存成列数据,函数使较长脚本可以分块编写。科恩转入研究岗位后,去除表单专用代码,加入历史记录、别名和作业控制,形成早期ksh。
参考:[1]
1983年多伦多会议上的介绍
1983年7月,USENIX与Software Tools Users Group在加拿大多伦多举行夏季会议。论文集目录把科恩的《KSH—A Shell Programming Language》列在星期四上午的用户界面场次,主持人为罗布·派克,论文起始页为191。
彼得·萨卢斯在2003年的会议回顾中将这一报告记在1983年7月14日。它把此前在贝尔实验室内部发展起来的命令语言介绍给Unix使用者群体。会议记录确定了公开技术交流的阶段,后来的商业分发又有另一套渠道。
把熟悉的编辑操作带到命令行
行内编辑来自不同开发者的工作:帕特·沙利文实现vi式编辑,迈克·维奇实现Emacs式编辑,两种方式后来都纳入ksh。用户输入复杂命令时,可以移动到错误位置修改,而不必重新键入整行。
《Learning the Korn Shell》第2版说明,用户可以通过set -o vi或set -o emacs选择编辑模式。这些模式主要复用编辑器的基本按键习惯;终端本身的控制键设置也会影响实际操作。命令行因此兼有文本编辑的便利与shell执行命令的功能。
用历史记录缩短重复操作
书中用一组已经执行过的命令解释历史功能。输入hist -l,会列出最近的命令和编号;hist -l 2 4则只显示第2至第4条。用户可以先确认曾经做过什么,再挑选所需的命令修改。
带编辑选项的hist能够把旧命令交给指定编辑器,退出编辑后执行改好的内容。若希望先整理成脚本,也可以把历史记录输出到文件,再单独编辑、检查和运行。这样,临时操作与可重复程序之间有了较平滑的过渡。
这一书中接口属于后期版本说明:ksh88把相关命令称为fc,ksh93使用hist并保留兼容方式。命令名称与版本关系影响旧脚本的可移植性。
参考:[5]
分发渠道与版本演进
随着AT&T内部使用增多,外部客户也提出需求。科恩记述,AT&T后来通过UNIX System Toolchest提供源代码许可,系统供应商可取得分发二进制版本的权利。ksh由内部工具进入更多Unix系统的发行环境。
1996年的《The New KornShell—ksh93》介绍了较新的数据与扩展机制:关联数组以字符串作键,复合变量把相关成员组织在一起,编译后的C函数还可以作为内建命令加入解释器。这些能力扩大了脚本处理数据的范围,属于ksh93阶段的发展。
一个按列显示文件名的脚本
上述1996年文章给出名为lsc的脚本,用粗体标出目录,并把文件名排列成多列。程序先用通配符取得当前目录中的项目,再逐个比较文件名长度,保留最长值,供后续计算显示宽度。
其中,max_stringSize保存当前最大长度;循环遇到更长的fileName时,就用新长度替换旧值。算术表达式在shell内部完成,文件名列表、循环、条件判断和输出安排共同组成一个实用的小程序。
这个例子体现了Korn shell把交互工作与编程结合的思路:同一个解释器既能调用外部工具,也能处理变量和控制流程。复杂应用仍可调用其他程序,而常见的组织与计算工作可以直接写进脚本。
参考:[4]