查看原文
其他

探索 Window 命令行演变史 —— 起源

OSC-协作翻译 开源中国 2018-08-20



协作翻译

原文:Windows Command-Line: Backgrounder

链接:https://blogs.msdn.microsoft.com/commandline/2018/06/20/windows-command-line-backgrounder/

译者:Tocy, kevinlinkai, 无若, 郭凯凯啊, 云逸于海


这是我们探索所有命令行的系列帖子中的第一篇 - 从命令行的起源和终端的演变,到我们在未来 Windows 发行版中对 Windows 控制台和命令行进行全面更新的做法。


无论你是经验丰富的老手,还是刚接触计算机(欢迎所有人),我们希望你能发现这些帖子的兴趣点、丰富的内容和有趣之处。 所以,拿一杯咖啡,然后通过命令行的起源进行旋风之旅!


很久很久以前,在一个机房...


早期的电子计算,人们需要一个有效的方式进行人机交互,并且能看到他们的命令和结果。


第一个真正意义上的有效的人机交互是电传打字机。电传打字机是电动机器让用户用键盘输入,而他的输出设备在早期期就是打印机,屏幕是对用户来说是近期的显示输出设备。


操作者键入的字符缓存到本地并且通过电传打字机发送到附近的小型机或者大型机,一系列的信号沿着线缆(比如RS-232线缆)以每秒10个字符的速度(100波特率/秒)。


打字传报机型号 33ASR


注意:令人兴奋的是David Gesswein 的 PDP-8 site有许多关于ASR33的信息(还有PDP-8和其他相关的技术),包括图片,视频等。


运行在电脑上的程序接受到键入的字符,然后再才能决定他们做什么,也许是随机的,异步的把字符发挥给打字传报机。打字传报机将会打印或者显示这些字符以供操作者读取和反应。


在接下来的几年里,科技的发展加速了传输的速度到19200波特每秒,并且用电子射线(CRT)管显示器替代了嘈杂的,还要花很大代价操作的打字机。这联系到八九十年代的终端,包括随处可见的DEC VT100 终端。


DEC VT100 终端


随着科技的发展,现在的终端发送字符给运行在电脑上的程序,电脑会以文本的形式输出给用户,作为一项基本的功能保留到今天,在所有的命令行和所以平台的终端上。


终端和命令行体系


事实上,部分高雅的现代设备的系统的每一个组件依然有最简单的和最原始的:从键盘释放字符缓存成电子信号去连接电脑。输出设备把字符写入连接电脑的显示器上面(例如:纸张,屏幕)。


并且因为系统的每一个阶段和下一个阶段交流通过最简单的字符流,这是一种相对简单的方式去介绍通信基础。比如,调制解调器会讯息输入输出流凭借电话线发送到很远。


文本编码


重要的要记住的是终端和计算机是通过字符串进行通信的:当按下终端键盘上的键时,表示键入字符的值将被发送到已连接的计算机。按“A”键,发送值为65(0x40)。按“Z”键,发送值为90(0x5a)。


7位ASCII文本编码


字符列表及其值在美国信息交换标准码(ASCII)标准(ISO/IEC 646 / ECMA-6)的“7位编码字符集”中定义

  • 表示可打印拉丁语A-Z(65-90),a-z(97-122),0-9(48-57)的128个值

  • 许多常见的标点字符

  • 几个不可显示的设备控制代码(0-31和127):


标准ASCII 7位字符


当 7 位不够用时——Code-Pages(代码页)


然而,7 位并不能提供足够的空间来编码诸多变音符号、标点符号以及其他语言和区域中所使用的符号。因此,通过添加一个附加位,ASCII 字符表可以使用定义了字符值为 128-255 的其他“代码页”集作扩展(并且可以重定义其他几个不可打印的 ASCII 字符)。

例如,IBM 定义了代码页 437 ,它添加了几个块字符,如╫(215)和╣(185),以及包括π(227)和±(241)的符号,并在通常不可打印的字符值范围 1-31 中重新定义了可打印字符:


Code-Page 437


Latin-1 代码页定义了拉丁语言使用的许多字符和符号:


Latin-1 Code-Page


许多命令行环境和 shell 支持用户更改代码页,这会导致终端显示不同的字符(取决于可用的字体),尤其是对于值为 128-255 的字符更为明显。但请注意错误的代码页可能导致显示的文本看起来像“乱码”。而且,是的,“mojibake”(乱码)是一个真实的术语!谁知道呢?


当 8 位不够用时 - Unicode


虽然代码页在一段时间内提供了解决方案,但它们有许多缺点,包括它们不允许同时显示多个代码页/语言的文本。因此,需要一种新的编码方法,以便准确表示人类已知的每种语言的每个字符和脚本,并留有足够的空间!


进入,Unicode 。

Unicode 是一个国际标准(ISO/IEC 10646),它(目前)定义了 137,439 个字符,涵盖146个现代和历史脚本,以及许多符号和字形,包括在几乎所有应用程序、平台和设备中广泛使用的许多表情符号。 Unicode 标准定期更新,添加了额外的编写系统,添加/修正表情符号等。

Unicode 还定义了“不可打印”的格式化字符,例如,允许字符拼接和/或影响前面或后面的字符!这在像阿拉伯语等脚本语言中特别有用,其中给定字符的连字由它所包围的字符决定!表情符号也使用“零宽度连接符”将几个字符组合成一个视觉字形;例如,微软的 Ninja Cat 表情符号是通过将猫表情符号与其他表情符号结合起来形成忍者猫表情符号而形成的:


Microsoft's Ninja Cat Emoji


当多字节太多了 – UTF-8!


表示由 Unicode 定义的所有符号所需的空间,尤其是复杂字符、表情符号等,可能非常大,并且可能需要几个字节来唯一且系统地定义每个可显示的字符。


因此,几种编码方法被开发出来,用于这种所需存储空间与编码/解码数据所需的时间/复杂度:UTF-32(4字节/字符),UTF-16/UCS-2(2字节/字符)和 UTF-8(1-4字节/字符)是最流行的 Unicode 编码。

在很大程度上要归功于 UTF-8 与 ASCII 码的向后兼容性机器存储效率,它已经成为互联网上最流行的 Unicode 编码,并且自2008年后其超越 ASCII 和其他流行编码以来,UTF-8 已被广泛采用了:


UTF-8 编码流行度增长趋势(来源: Wikipedia)


因此,虽然大多数终端最开始支持 7 位和 8 位 ANSI 文本,但大多数现代终端支持 Unicode/UTF-8 文本。


那么,什么是命令行? 什么是Shell?


“命令行”或CLI(命令行接口/解释器)描述了人类操作计算机的最基本的机制:CLI接受操作员键入的输入并执行所请求的命令。


例如,echo Hello将文本“Hello”写入到输出设备(例如屏幕)。 dir(Cmd)或ls(PowerShell / *NIX)会列出当前目录的内容。等等。

在早期的计算机上,操作员可用的命令通常相对简单,但操作员很快就要求越来越高的复杂度,并且能够编写脚本来自动执行常规或重复或复杂的任务。因此,命令行处理器的复杂度不断提高,并演变成现在通常被称为命令行“shell”的处理机制。

在UNIX/Linux中,原始的UNIX shell(sh)启发了大量的shell,包括Korn shell(ksh)、C shell(csh)和Bourne Shell(sh),它们本身引发了Bourne Again Shell(bash)等。

在微软的世界里:


  • 原始的MS-DOS (command.com)是一个相对简单的命令行shell(可能比较古怪)。

  • Windows NT的“命令行提示符Command Prompt” (cmd.exe)旨在与旧版MS-DOS command.com/批处理脚本兼容,并未新的、功能更强的操作系统体检了几个额外的命令。

  • 在2006年,Microsoft发布了Windows PowerShell

    • PowerShell是一款现代版的基于对象的命令行shell,受其他shell功能的启发,并且是基于.Net CLR & .NET框架基础之上的

    • 使用PowerShell后, Windows用户可以控制、编写脚本并自动执行Windows主机、Windows计算机组、网络、存储系统、数据等等各方面功能

    • 在2017年,Microsoft开源了PowerShell,并让其支持在macOS和诸多类Linux/BSD系统上运行!

  • 在2016年,Microsoft引入了Windows下的linux子系统(WSL)

    • 在Windows 10上直接支持真正的未经修改的Linux二进制文件执行

    • 用户可以从windows商店安装一个或多个正版Linux发行版

    • 用户可以执行一个或多个发行版实例,并可以和现有windows应用程序及工具一起运行

    • WSL使得Windows用户能够同时运行所有他们喜爱的Windows工具和Linux命令行工具,而无需双开或利用资源匮乏的虚拟机(VM)


我们将会重新阐释Windows命令行shell,但现在我们知道有各种shell,并且它们接受用户/操作员键入的命令,并根据需要执行各种任务。


现代的命令行


现代的计算机比过去的“简易终端”强大得多,并且通常运行于带有图形用户界面(GUI)桌面操作系统(例如Windows、Linux、macOS)。这些GUI环境允许多个应用程序同时运行在用户屏幕上各自的“窗口”内,它们可以显示在桌面或者隐藏在后台。


        在WSL上运行的Cmd、PowerShell和Ubuntu Linux独立控制台实例


沉重、笨重的电动机械电传打字机已被在屏幕窗口内运行的现代终端应用程序所取代,但其基本功能仍与过去的终端设备相同。


类似地,终端应用程序连接到的命令行应用程序工作方式也与过去的终端设备工作方式相同:它们接收输入字符,决定如何处理这些字符,(可选地)执行工作,并可以发出要显示给用户的文本。但是,与通过慢速的TTY串行通信线路通信相比,终端应用程序和命令行应用程序在同一台机器上使用非常高速的、内存中的伪电传打字设备( Pseudo Teletype,PTY)通信系统进行通信。


现代命令行


当然,虽然现代终端主要与本地运行的命令行应用程序通信,但它们也可以与在同一网络中其他机器上运行的命令行应用程序通信,甚至可以通过internet与在世界另一端运行的远程机器通信。这种命令行的“远程操作”体验是一个强大的工具,它在每个平台上都很流行,尤其是*NIX平台。


那么,我们在哪里?


在这篇文章中,我们对命令行的最重要方面进行了历史考察,这些方面对于 * NIX 和 Windows 都是通用的:终端、SHELL、文本和文本编码。


重要的是要记住上面的信息,我们将继续下一篇文章,我们将了解有关 Windows 控制台的更多信息,它是什么,它是如何工作的,它与 *  NIX终端有何不同,它有哪些挑战,以及我们正在通过哪些努力来解决这些挑战,并将 Windows 控制台带入21世纪!


敬请关注!




推荐阅读

Google 罚款将创新高!Android 垄断或被打破

大变样,Chrome 新一代 Material Design UI 来袭

Python 之父宣布退出决策层,Python 该何去何从?

认为 C++ 太糟糕,独立游戏教父“吹神”亲自开发新语言

颠覆网站 C/S 模式,没有服务器的网站会带来什么变革?

点击“阅读原文”查看更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存