在今年的 Build 2016 上,微软向全世界介绍了他们还处于 Beta 阶段的 Windows
下的 Linux 子系统(Windows Subsystem for
Linux)(WSL),它可以让开发者们在 Windows 10 下通过 Bash shell
运行原生的 Ubuntu 用户态二进制程序。如果你参与了 Windows Insider
计划,你就可以在最新的 Windows 10 年度升级版的 Insider
构建版中体验这个功能了。

在前天晚上的 Microsoft Build
大会上,微软发布且开源了一款新的命令行终端工具 WindowsTerminal,目前
GitHub 已突破 7500
Star,众所周知,windows内置的命令行工具,无论是cmd还是powershell,使用体验都不是非常如人意,关键原因是大量的开发者使用linux内核的服务器作为生产环境,很难想象在windows上做开发,在linux上部署的感受,简直是天壤之别。

命令提示符也是算 Windows
系统的一大特色了,相信很多人刚看到这白底黑字的界面都有点哭笑不得吧,好在后来微软陆续推出了Powershell、cmd之类的命令行工具,来提供一些更加高级的功能。

Web 开发人员们不用再苦恼所用的 Windows 开发平台上没有合适的 Linux
工具和库了。WSL 是由 Windows 内核团队与 Canonical
合作设计和开发的,可以让 Windows 10 下的开发者们在拥有 Windows
中那些强力支持之外,还能使用 Linux
下丰富的开发环境与工具,而不用启动到另外的操作系统或者使用虚拟机。这绝对是一个“来自开发者,服务开发者”的
Windows 10 特色,它的目的是让开发者们每天的开发工作都变得顺畅而便捷。

近年来,微软一直再说“Microsoft Love
Linux”,拥抱linux拥抱开源,之前win10就已经集成了,linux subsystem for
windows,不过本人看起来这个特性还是比较鸡肋的,因为在这恶个子linux系统,你是无法运行exe程序的,这个linux
for
windows的子系统更像是一个虚拟机,果然该来的还是会来,微软放大招了,直接集成了Linux的内核,那么一个更加Linux友好的命令行工具可以说是应运而生了,关键是她张的还很骚气,如图:

如今微软更进一步,放出一大招,正式发布了新款命令行界面——Windows
Terminal,有了它,Windows 电脑也能和 Linux 和 Mac 一样轻松做开发了。

在本文中,我会展示给你一些我认为非常有趣的功能,以及告诉你一些可以让你找到更多信息的资源。首先,我会展示
WSL 所集成的那些主要命令(比如
ssh)是如何操作服务器和设备的。其次,我会演示使用 Bash
脚本是如何以简明的方式来自动化执行任务的。其三,我会利用极棒的命令行编译器、一些其它工具以及对
*nix 兼容的能力来玩一个轻量级的古典黑客级游戏:
NetHack。最后,我会展示如何使用已有的 Python 脚本和其它来自网上的脚本。

图片 1

Windows Terminal一经发布,短短时间便在 GitHub
上获得了12159个Star,并且还登上 GitHub
趋势榜第一的位置,所以它到底有何威力,一发布就虏获广大程序员的放心?往下看就知道了:

从我的第一台 286 上运行的 Windows 3.0 开始,Windows
就一直是我的主要操作系统和开发环境。不过,我身边也有很多 Linux
服务器和设备。从树莓派和路由器/网关设备这样的物联网设备,到 Minecraft
服务器,它们堆满了我的办公室的每个角落。而我经常要从我的主工作站中去管理和配置这些
Linux 计算机。

毛玻璃的背景,可以配置的主题,Mac对笔者来说失去了最后的价值

什么是Windows Terminal?

管理服务器和设备

我在我的家中运行着一台无显示器的 Ubuntu Minecraft
服务器,这是我去年给我十岁大的儿子的圣诞礼物,但是它已经变成了我的玩具而不是他的(好吧,主要是我的玩具)。我以前在我的
Windows 10 电脑上使用几个客户端来管理它,不过我现在想使用 Windows 中的
Bash 里面的 ssh 命令行来管理它。使用类似 PuTTY 或来自 Cygwin 的 Tera
Term
这样的应用当然也可以,但是我想试试真正原生而自然的体验也是一种不错的选择。Cygwin
就像是在披萨店订购的披萨一样,好吃,但是没有那种氛围。

我已经使用 WSL
中的 ssh-keygen 和 ssh-copy-id 设置好了公私密钥对,所以使用 ssh
只需要如下简单输入即可:

$ ssh <username>@<server>

我还为此创建了一个别名,以便更快一些。这是一个标准的 Linux/Bash 功能:

$ alias mc='ssh <user>@<server>'

现在,我要访问我的 Minecraft 服务器只需要在 Windows 10 下的 Bash
中输入“mc”即可。

图片 2

当然,同样的方法你也可以用于任何 Linux 上的 Web
或数据库服务器上,甚至树莓派或其它的物联网设备也可以。

在终端里面进行 ssh 只是为了方便而已,不过当你在 shell
中工作时,如果还有类似 apt、node、Ruby、Python
等等工具时,你就有了自动化各种工作的可能。

Windows终端是一种新的、现代的、快速的、高效的、功能强大的,适用于命令行工具和shell(如命令提示符、PowerShell和WSL)的新一代高效的终端应用程序,并且改程序将通过Microsoft应用商店分发,并将定期更新,以确保始终保持最新状态,非常方便,下面就简单的介绍一下,这个新一代的Windows
命令行工具的一些特性多个选项卡支持

Windows Terminal
是一个全新的,现代的,快速,功能强大且高效的终端应用程序,支持PowerShell,Cmd,WSL和
SSH 等命令行程序。

远程脚本

假如说你有一大堆 Linux
服务器和设备,而你要在它们上面执行一个远程命令的话,如果已经配置好公私密钥对,你就可以在
Bash 中直接远程执行命令。

举个例子说,想知道远程服务器自从上次重启后已经运行了多长时间了,你只需要输入:

$ ssh <user>@<server> 'last -x|grep reboot'

ssh
会连接到该服务器并执行 last -x 命令,然后搜索包含“reboot”的一行。我在我的
Ubuntu Minecraft 服务器上运行的结果如下:

reboot   system boot  4.4.0-28-generic Thu Jul  7 08:14   still running

这只是一台服务器,如果你有许多服务器的话,你可以自动化这个过程。我在 WSL
里我的主目录下创建了一个名为 servers.txt 的文件,它包含了一系列 Linux
服务器/设备的名称,每个一行。然后我就可以创建一个脚本来读取这个文件。

在使用了很多年像树莓派这样的设备之后,我已经变成了一个 nano 人(在 VMS
上我是一个 LSEdit 人),下面是我用我喜爱的 nano 编辑器打开的脚本。

图片 3

当然,你也可以使用 vim 、 emacs 或者其它可以用在 Ubuntu 终端上的编辑器。

该脚本是 Bash 脚本,要执行该脚本,输入:

$ ./foreachserver.sh 'last -x|grep reboot'

它将迭代输出文件中的每个服务器/设备,然后通过 ssh
远程执行该命令。当然,这个例子非常简单,但是你可以像这样把你的本地脚本或其它命令变成远程的。Bash
脚本语言足够丰富,所以你可以使用它来完成你的大多数远程管理任务。你可以用你下载到
WSL 或远程系统中的其它应用来扩展它的使用。

你是否需要在工作中把本地的 Windows 文件或资源用于其它的 Linux
计算机吗?或者,你根本不使用 Linux ?Bash 可以操作本地的 Windows
文件或资源,还是说它就是一个完全独立的环境?

终端最经常需要的功能是多个选项卡支持,现在可以打开任意数量的选项卡,每个选项卡都连接到选择的命令行shell或应用程序,例如命令提示符、PowerShell、WSL上的Ubuntu、通过ssh的Raspberry
PI等。

这么说显然有些笼统,还是让你详细了解下它的主要功能吧,Windows Terminal
主要有以下特性:

使用 Windows 文件

WSL
系统可以通过 /mnt// 目录(挂载点)来访问你计算机上的文件系统。举个例子,你的
Windows 上的 C: 和 D: 根目录可以在 WSL 中相应地通过 /mnt/c 和 /mnt/d
访问。当你要把你的 Windows 下的项目文件、下载的内容和其它文件用到
Linux/Bash 之中时这很有用。

图片 4

上图显示的两个目录分别对应于我的计算机上的 SSD 和硬盘:

图片 5

这是逻辑挂载,所以当你在 shell
中使用类似 mount 这样的命令时它们不会显示。但是它们可以如你预期的那样工作。举个例子,在
Windows 中,我在我的 C 盘根目录下放了一个名为 test.txt 的文件,我可以在
WSL 中如下访问它:

图片 6

在 Build  Tour
大会期间,我们要确保所有的演示都可以在没有互联网时也能正常工作(你绝不会知道会场的网络是什么样子的)
,所以为了让 Bash/WSL 可以演示 Git 操作,该演示访问的是本地计算机上的
Windows 文件,我在 Windows 上的 C:gitNetHack 下设置一个本地仓库。 要在
WSL 中进行 clone 操作,我执行了如下命令:

$ git –clone file:///mnt/c/git/NetHack

该命令告诉 git 使用 file:// 协议,并 clone 了位于 /mnt/c/git/NetHack
下的仓库。你可以以类似的方式来访问你的 Windows 下的所有文件。

警示:就像在其它终端中一样,如果你不小心的话,你可以在 Bash 中修改/删除
Windows 文件系统中的文件。举个例子,你可以像下面这样来干掉你的 Windows
,假如你有合适的权限的话。

$ rm -rf /mnt/c/  [千万别试!][千万别试!][千万别试!]

我之所以郑重提醒是因为我们很多人都是刚刚接触 Linux 命令,它们不是
Windows 命令。

这种可以让文件系统集成到一起的魔法来自
DrvFs。如果你希望了解该文件系统的更多细节,以及它是如何工作在 WSL
中的,WSL
团队为此写了一篇详细的文章。

当然, 文件系统访问只是 WSL
其中的一部分功能而已,许多开发任务还需要通过 HTTP
或其它网络协议访问远程资源。

图片 7

多标签

发起 HTTP 请求

从脚本或命令行而不是从一个编译好的程序或 Web 页面上发起 REST 或其它
HTTP(或 FTP)请求是很有用的。就像在大多数 Linux 发行版一样,WSL
也包括了类似 curl 或 wget 获取资源这样的标准功能,它们可以用来发起 HTTP
或者其它网络请求。举个例子,下面是使用 curl 对 Github 发起 REST
请求来获取我个人的属性信息:

$ curl -i https://api.github.com/users/Psychlist1972
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 13 Jul 2016 02:38:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1319
Status: 200 OK
...
{
  "login": "Psychlist1972",
  "avatar_url": "https://avatars.githubusercontent.com/u/1421146?v=3",
  "url": "https://api.github.com/users/Psychlist1972",
  "name": "Pete Brown",
  "company": "Microsoft",
   ...
}
$

你可以用它和 Bash 脚本来创建一个 REST
API
的快速测试客户端,也可以用来探测一个 Web
页面或服务器并报告其返回的状态。它用来从网上下载文件也很棒,你可以简单地重定向输出到一个文件而不是在屏幕上显示它:

$ curl -i https://api.github.com/users/Psychlist1972 > pete.json

我也是一个 PowerShell 用户,甚至还使用 Windows 10 MIDI in
PowerShell 创建了一些有趣的扩展,也修复过出现在特定的录音硬件设备上的一些文件问题。作为长时间的
.NET 开发者和爱好者,我经常使用和扩展 PowerShell
以满足我的项目需求。但是  PowerShell 并不是一个可以运行所有的那些 Bash
脚本和针对 Linux
的开源工具的地方。我希望以一种最简单、最舒服的方式来完成这些任务,在某种意义上,这意味着我们需要在
Bash 中完成它们。

我已经一掠而过的介绍了 Bash、Bash 脚本以及你可以在 shell
中完成的任务。到目前为止,我谈论的都是有助于开发工作的那些功能。但是在
WSL 中实际的开发和编译工作是怎样的?我在 Build Tour
大会上演示了下面这个部分。

2.多主题配置

无数的开发者都向微软反馈过这个问题,如今终于在 Windows Terminal
上实现了,你可以打开任意数量的选项卡,每个选项卡都可以连接到多个环境或服务器,例如
PowerShell、WSL 上的 Ubuntu、SSH 上的 Raspberry Pi 等等。

Build Tour 大会上的演示:NetHack

这个夏初,来自微软的讲演者们向大家演示了一些来自 Windows
和微软云上的很酷的开发者新功能。作为其中的一部分,我以一种好玩的方式来演示了
WSL,而且这是一种和开发者们相关的方式。

我个人想要展示使用 git 和一些传统的终端开发工具,我已经写好了 Bash
的演示程序,包括了这些基础的东西(用 Python 和 Ruby 写的“Hello
World”),不过我还是想要更有冲击力一些。

我回想起我在大学的时光,那时我们在 Unix(DEC Ultrix 及 SunOS)和 VAX/VMS
之间折腾,Unix
几乎全是命令行环境。在我们学校,绝大多数使用图形工作站的用户只是为了在不同的窗口打开多个终端会话而已,当然,会在桌面背景放上一张超酷的月相图。大部分学生都是使用
VT-220 终端来打开他们的会话(学校离波士顿不远,所以我们有很多 DEC
设备)。

那时,计算机系的学生们主要玩两大游戏:MUD (主要是 lpMUD 和当时刚出的
DikuMUD)和 NetHack。NetHack
和其它的 Roguelikes 类游戏被视为历史上最有影响力的游戏之一,它们是许多现在流行的地牢冒险和角色扮演类游戏的鼻祖。

NetHack 有很长的历史,现在的它包含了来自几十年前的几十万行 *nix
代码,以及后来补充的一些代码。该游戏使用 curses) (及其替代品)作为终端交互方式,需要通过
lex、 yacc(或 flex 和 bison)和 cc(或
gcc),以及一堆其它的开发工具构建。

它是由 C 语言编写的,并包括了一些用 Bourne
shell 编写的复杂的脚本配置功能。我觉得它是一个体现
WSL 和 Bash on Windows 10 的开发者能力的不错而有趣的方式。由于使用了
curses(在 Linux 和 WSL 中是 libncurses 库),它也可以用来展示 Windows
10 中命令行窗口中的终端模拟能力。

以前,在我们的分时 Ultrix 服务器上从源代码构建 NetHack
要花费掉我们很多时间,而现在我的个人计算机上只需要几分钟就可以搞定。我喜欢这种技术进步。在
Linux 或 WSL 上配置和编译 NetHack
有容易和复杂两种方式。为了节省时间,我们会以容易的方式来进行。

Windows终端使用基于GPU加速的DirectWrite/DirectX的文本呈现引擎。这一新的文本呈现引擎将显示文本字符、字形和存在于您电脑字体中的符号,包括CJK汉字、emoji、电力线符号、图标、编程连接符等。该引擎呈现文本的速度也比上一个控制台的gdi引擎快得多!

文本渲染

前置需求

首先,更新你的 WSL
环境,确保你的软件是最新的。在安装新的软件包之前,这是一个好的做法。

$ sudo apt update
$ sudo apt upgrade

然后,安装必须的开发工具。最简单的办法就是使用 build-essential
软件包,它包括了 Linux 开发者构建以 C/C++
开发的软件时所需的绝大部分程序。

$ sudo apt install build-essential

这要花几分钟。如果你想更加深入地了解,你可以分别安装
gcc、gdb、make、flex、bison 以及 NetHack
文档中提到的其它工具。不过如果你是一位开发者,有时候你可能还需要一些其它工具。 build-essential
基本上提供了你所需的工具集。

然后,安装 git。如你所想,很容易:

$ sudo apt install git

就像在 Linux 中一样,你可以添加一个 git 的 PPA
来获取较新的版本,不过这里我们有一个就行了。

最后,我们需要安装 curses(实际上是 ncurses)来进行终端屏幕交互。

$ sudo apt install libncurses-dev

当我们完成这些步骤之后,就可以开始构建 NetHack 了。

图片 8

Windows Terminal 使用 DirectWrite/ directxbased 的 GPU
加速文本渲染引擎。这个新的文本渲染引擎支持显示 PC
上的文本字符,字体和符号,其中包括中日韩统一表意文字、编程连接,甚至还支持
Emoji 表情等。而且这个文本渲染引擎的速度比之前的 GDI 引擎快多了!

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注