探求庐山真面目
圣贤告诉我们要"只知其然知其所以然",为什么
git bash不支持tree命令?
重走当年长征路
重温当初走过的路,试图从安装 git 时能否找到蛛丝马迹,大多数情况下我们是采用安装 git 顺带集成的git bash 命令行工具.
下载安装的无关截图这里就不展示了,一步一步重新安装 git 时看到了一点蛛丝马迹.
原文: Git Bash will use MinTTY as terminal emulator, which sports a resizable window, non-rectangular selections and a Unicode font. Windows console programs(such as interactive Python) must be launched via' winpty' to work in MinTTY.
翻译:
MinTTY是MSYS2的默认终端,git bash将使用MinTTY作为终端模拟器,如有需要调用Windows程序必须通过winpty才能正常工作.
上述介绍文字虽然看起来并不起眼,毕竟我们安装 windows 程序时基本上都是下一步下一步就完成了安装,但是作为重点理解为什么 git bash 不支持 tree 命令,我们有必要好好研究这段话.
git bash是命令行工具没错,但是模拟终端实际上是MinTTY,所以与其说git bash不支持某些linux命令,不如说为什么安装的MinTTY终端不支持.MinTTY是一种模拟终端,是MSYS2的默认终端.- 调用
Windows程序时必须通过winpty开头才能在MinTTY终端正常工作.
通过上述分析,我们得到了一条重要线索:
MinTTY终端和MinTTY系统.
总结经验有感悟
安装过程中仅能获取到这些有效信息,那么安装完成后能否提供更多细节呢?
点击 git bash 图标或者右键唤起菜单项(Option...),查看关于(About)软件介绍.
简介的正上方标题是 mintty 而不是git bash ,这也验证了安装 git bash 时配置的模拟器确实是 mintty .
mintty 在很大程度上基于 PuTTY ,其中 mintty 的项目官网是 http://mintty.github.io/.
现在我们又多了一条线索,mintty 是基于 putty 二次开发的产品,并且既然 mintty 的官网地址是使用 github 的 github page 搭建的,从而可以猜测出 mintty源代码八成也托管在 github.
再次整理下目前积累的线索:
git bash内置mintty终端,从而实现类似于linux命令行的开发体验.mintty是mysys2的默认终端,猜测mysys2大概是类似于linux这种操作系统吧.mintty是基于putty二次开发的产品,运行windows控制台程序时必须通过winpty调用,暂时无法猜测winpty是什么性质的产品.
抓住线索再出发
先不管那么多,先去看看 mintty 的官网,发现更多细节吧!
官网介绍带我们了解了更多细节,一步一步解读,看看 mintty 到底是什么鬼?
原文: Mintty is a terminal emulator for Cygwin, MSYS or Msys2, and derived projects, and for WSL.
翻译:
mintty是cygwin,msys或者msys2的终端模拟器,是派生项目,为了wsl.
言简意赅的自我描述向我们展示了三个重点,首先是终端模拟器,其次是 cygwin ,还有 msys 和 msys2 ,最后是 wsl .
一下子暴露出这么多陌生名词并且分别给出了链接,看起来他们并不简单,当然现在还不是了解他们的最佳时间,当务之急还是先看看 mintty 官网向我们传达了什么有价值的信息吧!
Xterm-compatible terminal emulation, coverage of DEC VT300 series terminal features and more.
- 兼容
Xterm终端模拟器,覆盖DEC VT300系列终端功能等.
又冒出两个陌生名词,不过这两个好像并不重要,只不过是说 mintty 是终端模拟器并且兼容 Xterm 和DEC VT300模拟器.
这条信息的价值不是很大,我们早已经知道 mintty 是一种终端模拟器了,至于和其他模拟器兼容性如何并不是很关心.
Running in Cygwin, MSYS(2), midipix. Also hosting WSL. Running on Windows XP, Windows 7, Windows 10.
运行在cygwin,msys(2)和midipix,并且托管在wsl.- 运行在
Windows xp,Windows 7和Windows 10.
这段话证明了我们两个猜想,msys 是操作系统以及 wsl 很重要,已经是第二次出现了.
Mintty works on all Windows versions from Windows XP onwards. Similarly to other Cygwin/MSYS terminals based on pseudo terminal ("pty") devices, however, mintty is not a full replacement for the Windows Console window (by default running the Windows Command Processor / command prompt / cmd.exe). While native console programs with simple text output usually work fine, interactive programs often have problems, although sometimes there are workarounds. See the Wiki section about Input/Output interaction for hints, especially on the winpty wrapper.
mintty是一种终端模拟器,在windows上运行地不错,和其他基于pseudo terminal ("pty")的终端模拟器类似,并不能完全替代Windows控制台.简单文本输出的原生控制台程序可以正常工作,但交互式程序则会遇到问题.更多详情请查看winpty包装器.
这段话满是干货,官宣直接验证本文开篇结论,git bash 并不能完全替代 cmd.其次就是频繁出现的winpty 到底是什么,不仅安装 git 时出现了,现在又出现了.
看来也是很重要的一个名词,毕竟给出相关链接的名词都不是简单名词.
In Cygwin, it is installed as the default "Cygwin Terminal". For MSYS (old), select the msys-mintty package in the installer. (Or from MinGW, install the package with mingw-get install mintty.) For MSYS2, mintty is installed by default, or it can be installed later with the command pacman -S mintty.
mintty还是cygwin系统的默认终端,msys系统安装msys-mintty进行安装mintty(或者MinGW通过mingw-get install mintty进行安装),MSYS2通过pacman -S mintty安装.
这段话向我们展示了各个操作系统如何安装 mintty,虽然大部分情况下默认已安装,但还是提供了手动安装的解决方案(当然都是通过包管理工具方式进行安装).
看起来和我们无关,因为安装 git bash 时已安装了 mintty 了啊,自然不需要再手动安装.
但是,仔细想一想这篇文章之所以存在不正是因为 git bash 命令行没有提供 tree 命令吗?
既然没有提供 tree 命令,那我们手动安装就好了吧?
可是,事情远远没有这么简单,linux 系统中安装第三方命令大概分为两种途径,一种是包管理工具,另外一种是源码编译方式.
那么作为 windows 系统的 git bash 也能如此扩展第三方命令吗?
答案是不能!
因为 mintty 本身就是通过包管理工具安装的,证明我们是没有包管理工具可以扩展第三方命令,正如人可以造房子,但是已造好的房子还能自己造桌子椅子吗?
源码编译的方式能否扩展第三方命令呢?对于这部分不敢妄自猜测,可能可以也可能不可以.
可以的原因在于 linux 进行源码安装时依赖的是 c 环境进行编译安装,如果 windows 系统也安装 c 环境进行编译应该也能成功.
不可以的原因在于 windows 毕竟不是 linux ,底层差异还是非常大的,可能无法支持全部 linux 特性,不然 git 移植过程中也不必维护那么多项目才能提供背后技术支持.
不管怎么样,可以预见的是,即使通过编译安装的方式能够扩展第三方命令,但过程想必十分复杂,自然不是我等小白能够轻松扩展的.
所以两种扩展途径基本上都不能扩展第三方命令,真的需要扩展命令的话,要么安装完整的坏境使其带有相应的包管理工具,要么源码编译安装并支持 windows系统.
简单回顾一下 mintty 官网传达出的有价值信息点有哪些?
mintty是cygwin,msys(2)的默认终端模拟器,托管于wsl.mintty兼容Xterm模拟器,是一种伪终端,调用原生控制台程序时需要借助winpty进行包装.mintty只是终端,不具备包管理功能,可能无法扩展第三方命令.
跟随线索刨到底
刨根要问底儿,只有知道是什么才能更好地回答为什么.
刚才研究 minty 官网时留下了几个特殊名词,Cygwin 和 MSYS(2) 系统以及 WSL.
根据上文的猜测,Cygwin 和 MSYS(2) 应该都是一种操作系统,那么暂时先不深究他们之间有什么关系,现在先看看 WSL 是怎么回事?




