在操作系统中shell是一个极为重要的概念,它是对开放的用户界面与开发环境的抽象(我在博客《关于软件与云服务》中讨论过开放的软件平台)。英文shell本意为壳层,用来形容一层包裹一层的shell环境极为恰当。Shell的发音又与share(分享)相近(较早的Unix标准Shell环境叫作Bourne Shell)。
一个shell环境定义一组用户关心的对象与操作这些对象的的语言(语法)。称之为语言并不为过,因为语言是精确表达的需要,而shell环境提供了以文字形式描述操作、并且将操作组合成更复杂的操作的能力。例如,
文本编辑器Emacs或VI本身就是shell环境。Emacs是一个Lisp的shell环境,其中每个用户操作,如一次按键,都对应一个命令;这些命令有Lisp源代码,可以被组合成更复杂的命令或者被用户定制。VI则鼓励使用行编辑命令及外部命令操作文本。
对文档的编辑可被视为一系列的用户操作,VI将这些操作视为分离的带参数的元命令,如c$...
(以输入内容更改文本至行末)、di{
(VIM扩展命令,删除大括号之内的内容)。这些元命令显然也可以被扩展支持更高级的操作,如更改源程序中的函数或变量名称、或更改一个函数的函数体。如果将这些元命令记录下来,就成为用户的编辑操作记录。标准的版本控制软件如CVS或GIT,保存新版本与旧版本之间的diff,它记录被删除/添加/更改的文本行。实际上,可以直接用编辑操作的元命令来记录新旧版本之间的区别,并且用高级的元命令最为节省,删除/添加/更改文本行只是最低级的元命令。VI对此的支持实际上是内置的。使用元命令的版本管理还能潜在地支持更高级地检索,如检查一个函数被更改的历史。
如果一个团队的多名成员参加编辑同一个文件,每次编辑完成以后以元命令文件的形式将更改保存到共享目录下。可以调用管理员的脚本拷贝文件至共享目录,如果有append(与write相对)的目录及文件权限更为方便。在编辑器的shell环境中执行元命令文件就能直接生成编辑后的结果,并且操作系统可以缓存未改变的计算结果(包括中间结果),因此版本控制下重复处理多个元命令文件应能被操作系统自动避免。实际上,操作系统可以支持视图的概念,即文件内容动态生成,并按照需要缓存计算结果。
Emacs与VI都缺少描述内部机制的清晰文档,如Emacs有较详细的使用文档与Lisp的手册,但没看到各种功能如何实现的说明。我们常用的VI版本VIM声明是克隆版,未公开清晰的内部结构(欢迎页有“帮助乌干达的可怜儿童”标语)。实际上,有清晰的概念、容易被理解扩展的操作系统与编辑器非常有趣。必须提供良好的文档与源码,让不同专业的学生与员工有学习知识、在应用中享受技术、并作出自己的贡献的机会。实际上,由于动力来自真正的兴趣而非利益,主动学习这些技术是比考试更可靠的衡量求知欲与能力的标准。(微软与苹果的创始人比尔?盖茨与乔布斯都是大学辍学者。)
非文本文档的编辑器,如图形编辑器,也可被做成shell,并且版本管理也可以用元命令文件来支持。实际上,开源的GIMP图形编辑软件(功能与Photoshop相似),就构建在公开的图形处理工具库GTK的基础上;而无论GIMP还是Photoshop的使用都不够舒适,用户与开发者应当贡献更优质的工具集。
SQL数据库服务器的用户交互也是shell环境,不过声明式的SQL语言与其他命令式语言截然不同。SQL语言描述操作的目的、而不是完成操作的具体步骤。
SQL的shell环境可被搭建在更为基础的文件系统的shell环境之上。实际上,并不难想象在简单的Unix文件工具的基础之上,如搜索顺序文件或索引文件找出需要的记录,来实现SQL的查询功能。较有趣的话题是由操作系统(或较基础的shell工具)自动支持调度:当同时有多个SQL查询使用同一数据文件时,只扫描这个文件一次;甚至于当前一个命令已经在使用数据文件的后面部分,后一个命令可以首先共同使用这部分的数据。自动调度功能可能要求将数据文件映射(mount)为记录(子文件),并且对它们的操作在概念上是并行的。同理,当多个命令需要写入同一个文件块(的不同记录)时也只写一次,它们一起成功或一起失败。
我在一篇博客中提到过数据文件的映射。我建议使用用户自己选择格式的只读交易数据文件作为基本数据源,而从它们产生与SQL查询兼容的视图。我还指出用光盘保存数据的优点,光盘体积小、只读、可被增量刻录,适于备份重要数据。我在另一篇博客中讨论了开放的软件平台的重要性。
通过图形界面作数据库操作也是数据库shell环境的一部分,图形界面操作被转换为SQL命令执行。
操作系统如Unix自带的shell环境及桌面文件管理器等,是普通用户最熟悉的shell环境。概念上文件管理器的操作也被转换为shell命令执行。使用shell命令的直接好处是操作有自然的log,并且如果操作系统支持transaction,可以在确认操作无误时提交操作、或者在有问题时选择回滚操作。实际上,系统管理员所作的严肃的管理操作都应当用shell脚本完成,即使使用图形界面也应首先生成清晰易读的脚本,这些脚本方便管理员在执行操作前检查并留下清晰的工作记录。
目前常见的shell环境显然有太多可以改进之处。比如,用户希望将一组文件选入一个变量,他可能使用通配符、扩展名或者日期等筛选条件,然后再从中选择;他可能希望快速地列出剩余的文件。他希望在用编辑器编写脚本的时候,能够快捷地完成这些任务,并且如果需要能够使用图形界面来作选择操作。他希望在编写脚本时能够得到命令及参数的提示,就象在编写C#程序一样。最重要的是,脚本应当尽量简洁清晰、一目了然,就象自然语言一样。
在社区内部使用的shell环境应当尽量提供命令的源脚本,但并不是说软件产品免费。简单清晰的源代码是产品质量的标志,没有它可以不接受产品,这就象如果数学证明过于复杂、那一定是因为概念还不够好一样;源代码也帮助用户学习及定制改进、作出自己的贡献。
在实际工作中,我们总是希望能够有足够好的命令集与语言来编写脚本,最好能够避免复杂的文件选择,甚至于日常的操作都用简单的命令就能完成。但是,允许用户与普通开发者扩充命令集并参加改进脚本语言及环境本身极为重要,它是创新的源动力,也是个人与团队能力的很好的考评依据。团队在没有标准做法时,自己为合理的开发与管理划出界线,这既有趣又有挑战性;团队在为自身项目努力的同时,也促使软件行业的进步。我们的考试常常是强迫工作,有捉弄与虐待的性质,团队管理也通常是面向控制人而不是有难度的事;作为一个基本社会法则,团队应当自然地团结合作而不能靠强迫,没有谁有权力操控捉弄他人(包括捉弄性的考试),而外在的挑战(包括技术难度)会促进团队的交流合作、相互学习。一些脚本环境,如Bourne shell、Perl,本身有一定的优雅性,前者基于简单干净的基本元素,后者引入类似自然语言的语法(但未说明实现机制及如何扩展定义新的语法),但使用都很有难度(都需要改进)。不能因为害怕挑战就放弃尝试这些环境,这些挑战会带来丰厚的知识积累并提高社会的素质,它们为对团队能力的非侵入性的研究提供了素材。
较复杂的系统应当将复杂的命令用shell脚本分为独立的命令的组合。这么做有以下好处:
在向社区外发售时,可以将软件界面与用到的底层shell环境编译成唯一的可执行文件,并且内部结构可作改动以防黑客入侵,但用户就失去了更深入的享受与参与的机会。
编程语言的解释环境与调试环境也是shell,它们用于管理用户空间的代码,以及运行或测试代码。解释与调试环境实际上是相同的概念,只是很多解释环境故意不支持调试,而调试环境不支持更改代码。
实际上,解释环境应当与编辑器很好地结合,编辑器最好不必自行分析语法,而由解释环境帮助标记语法元素,并支持参数提示、文档说明、跳转等。二者应当无缝地融合,如可以在解释器内直接添加、编辑类的方法,并将结果保存到源文件中;又如在设置了试验参数后,编辑程序的过程中能够看到每个变量的计算值、及它的方法,这对于编写弱类型的脚本程序尤为方便。
嵌套的shell应当有交互的能力。例如,FTP是最常用的下载软件及数据文件的协议,它也是一个shell。但是FTP shell的功能较为原始,不支持脚本,难以自动选择要下载的文件或自动更名文件。这就需要在使用FTP shell的时候,调用外层的本地shell的功能,使本地shell的脚本能被用来管理(发令执行)FTP的shell命令。这一概念的应用实际上更加广泛,例如一些桥牌与国际象棋俱乐部的服务采用远程shell(telnet)的形式,更为高级的图形界面建立在它之上,而用户可以自己编写脚本参加比赛并评级(按道德应当说明是计算机选手)。标准的Unix有termcap数据库,它用来描述各种不兼容的文本终端的显示能力,而它可能暗示不同用户脚本在使用标准用户界面(如FTP)时表现出来的能力;这个概念也会被应用到如黑客能力的分析中。
另一个较为有趣的shell环境是remote shell(rsh),它不仅是远程登录的shell环境,rsh(与rcp)也被用来直接执行远程命令、拷贝远程文件。原则上来说,如果本地shell支持嵌套shell的交互,就能轻松地完成将远程执行结果重定向到本地文件、或者其他远程与本地的用户或脚本互动。这样,仅有telnet就足够,而不再需要特别的rsh工具。
许多游戏应当对玩家公开shell环境,方便玩家定制,如角色的形象、性格、地图、剧情等。参与定制会使游戏变得非常有吸引力,这就象为自己拍电影一样。较复杂的性格、策略等也许用参数描述并不足够,而需要编写算法脚本来表达。玩家之间也可以编写脚本进行机器人比赛,或者带领由脚本管理的下属参加比赛。玩游戏需要隐私,也需要成就感,因为它记录激情与幸福的时刻;不能强迫与不认识的人玩网络游戏相互竞争、或者在游戏中受捉弄。游戏应当安装在本地,以实时获得真正的电影般的视频效果与智能处理。买卖游戏道具是极为愚蠢幼稚的,它似乎暗讽在现实生活中用钱来购买成就感(如课堂或书本讲解不清,需要另请家教上补习班来理解知识点)的不公平作法。
强调“干净”、限制脚本编程是我们国家的悲哀。Queen乐队著名的摇滚歌曲《I will rock you》唱到,“You got mud on your face, you big disgrace, kicking your cans all over the place. Singin’ we will we will rock you.”这首歌似乎在说中国的开发者以暗中控制、将用户隔离在开发圈之外为荣的心态,或者指要教训编程“不守规矩”的程序员。编程是团队的工作,程序员自然在团队的环境中习得良好的习惯,这也包括从开放工具的源码中学习。限制是将操控的享受置于真实的技术享受之上,它本身是邪恶的;它破坏了技术的多样性与创新,会使我们的技术严重落后。
对学生能力的考评应当由老师在课堂交流中(如课堂讨论、做有挑战性的练习、参与思考研究)作出,老师可以对选课的学生作筛选限制(如基础课程及成绩、研究经验等),但老师有义务清晰地讲解知识。为此,老师必须有权安排自己的教学计划,按照自己的兴趣带领学生加入研究;社区必须有教育的隐私。无论对学生还是对技术员工,考评的最终依据是贡献的想法,而不是知识点;知识点是由选过哪些课决定,确保成绩单的信用是学校的义务,而不是学生的责任。考试常有捉弄性,暗含不平等的人格关系,阻碍自然的交流与互助,这对于师生都有巨大的毒害作用(基督教主祷词“不要叫我们遇见试探”)。现代科技提供了无数享受知识、发挥才能的机会,同时社会又面临巨大的就业压力,必须鼓励自由的才能发挥,并通过个人与团队的实际贡献、而不是监控数据来考评。将高科技用于搜集隐私、操控、及捉弄性的考试是邪恶的,必须被社会抵制。
中国在计算机行业、互联网及很多方面很可能已经受到国际社会的歧视。一些主要软件的文档与示例明显不合格。一些重要网站如Wikipedia.org、yahoo.com改为使用HTTPS,暗示更严格的session记录与隐私搜集;Yahoo的主页在翻页时自动播放出现在视窗内的新闻视频条目,暗示用户滚动页面的操作被搜集。这些违反了自然的浏览隐私规则,显然在针对中国人,向中国的隐私标准看齐。许多翻译的技术书籍,以及一些介绍科技与政治人物的书籍质量低劣缺少趣味(如《乔布斯》),这也在匹配中国出版物的质量。我的互联网联接不能上Twitter、Facebook、Youtube等国际性社交网站。这些与世界性的享受知识与现代生活的浪潮形成巨大反差,显示中国极为可悲的前景,这必须得到即时的反思与更正。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/hk201406/article/details/48087329