看过git bash的朋友圈才知道cmd为啥会呵呵一笑(二)

简介: 曾以为 git bash 能够完全取代 cmd ,谁知道 cmd 却投给我一个鄙视的眼神! git bash 确实能够在一定程度上替代 cmd ,但是默认安装的 git bash 命令行工具并不能彻底取代 cmd ,难怪 cmd 听说要让自己退休,会呵呵一笑了!

探求庐山真面目

圣贤告诉我们要"只知其然知其所以然",为什么 git bash 不支持 tree 命令?

重走当年长征路

重温当初走过的路,试图从安装 git 时能否找到蛛丝马迹,大多数情况下我们是采用安装 git 顺带集成的git bash 命令行工具.

下载安装的无关截图这里就不展示了,一步一步重新安装 git 时看到了一点蛛丝马迹.


10.png

原文: 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.

翻译: MinTTYMSYS2 的默认终端,git bash 将使用 MinTTY作为终端模拟器,如有需要调用Windows 程序必须通过 winpty 才能正常工作.

上述介绍文字虽然看起来并不起眼,毕竟我们安装 windows 程序时基本上都是下一步下一步就完成了安装,但是作为重点理解为什么 git bash 不支持 tree 命令,我们有必要好好研究这段话.


11.png


  • git bash是命令行工具没错,但是模拟终端实际上是 MinTTY ,所以与其说 git bash不支持某些linux命令,不如说为什么安装的MinTTY终端不支持.
  • MinTTY 是一种模拟终端,是MSYS2的默认终端.
  • 调用Windows程序时必须通过winpty开头才能在MinTTY终端正常工作.

通过上述分析,我们得到了一条重要线索: MinTTY 终端和 MinTTY 系统.

总结经验有感悟

安装过程中仅能获取到这些有效信息,那么安装完成后能否提供更多细节呢?


12.jpg


点击 git bash 图标或者右键唤起菜单项(Option...),查看关于(About)软件介绍.

简介的正上方标题是 mintty 而不是git bash ,这也验证了安装 git bash 时配置的模拟器确实是 mintty .

mintty 在很大程度上基于 PuTTY ,其中 mintty 的项目官网是 http://mintty.github.io/.

现在我们又多了一条线索,mintty 是基于 putty 二次开发的产品,并且既然 mintty 的官网地址是使用 githubgithub page 搭建的,从而可以猜测出 mintty源代码八成也托管在 github.

再次整理下目前积累的线索:

  • git bash内置mintty终端,从而实现类似于linux命令行的开发体验.
  • minttymysys2 的默认终端,猜测mysys2大概是类似于linux这种操作系统吧.
  • mintty是基于putty二次开发的产品,运行windows控制台程序时必须通过 winpty调用,暂时无法猜测winpty是什么性质的产品.

抓住线索再出发

先不管那么多,先去看看 mintty 的官网,发现更多细节吧!

13.jpg


官网介绍带我们了解了更多细节,一步一步解读,看看 mintty 到底是什么鬼?

原文: Mintty is a terminal emulator for Cygwin, MSYS or Msys2, and derived projects, and for WSL.

翻译: minttycygwin ,msys 或者 msys2 的终端模拟器,是派生项目,为了 wsl .

言简意赅的自我描述向我们展示了三个重点,首先是终端模拟器,其次是 cygwin ,还有 msysmsys2 ,最后是 wsl .

一下子暴露出这么多陌生名词并且分别给出了链接,看起来他们并不简单,当然现在还不是了解他们的最佳时间,当务之急还是先看看 mintty 官网向我们传达了什么有价值的信息吧!

Xterm-compatible terminal emulation, coverage of DEC VT300 series terminal features and more.

  • 兼容Xterm终端模拟器,覆盖DEC VT300系列终端功能等.

又冒出两个陌生名词,不过这两个好像并不重要,只不过是说 mintty 是终端模拟器并且兼容 XtermDEC VT300模拟器.

这条信息的价值不是很大,我们早已经知道 mintty 是一种终端模拟器了,至于和其他模拟器兼容性如何并不是很关心.


14.png


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 7Windows 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 官网传达出的有价值信息点有哪些?

  • minttycygwin ,msys(2)的默认终端模拟器,托管于wsl.
  • mintty兼容Xterm模拟器,是一种伪终端,调用原生控制台程序时需要借助winpty进行包装.
  • mintty只是终端,不具备包管理功能,可能无法扩展第三方命令.

跟随线索刨到底

刨根要问底儿,只有知道是什么才能更好地回答为什么.

刚才研究 minty 官网时留下了几个特殊名词,CygwinMSYS(2) 系统以及 WSL.

根据上文的猜测,CygwinMSYS(2) 应该都是一种操作系统,那么暂时先不深究他们之间有什么关系,现在先看看 WSL 是怎么回事?


相关文章
|
8月前
|
Shell 开发工具 git
【Github】git bash将本地工程上传至github
【Github】git bash将本地工程上传至github
|
Shell Linux 开发工具
设置IDEA的 Terminal 使用 git bash
设置IDEA的 Terminal 使用 git bash
644 0
设置IDEA的 Terminal 使用 git bash
|
Shell 开发工具 git
2021年了, 如何将 Git Bash 设置为 VSCode 的终端?
2021年了, 如何将 Git Bash 设置为 VSCode 的终端?
319 0
|
Shell 开发工具 git
【Github】git bash将本地工程上传至github
【Github】git bash将本地工程上传至github
|
关系型数据库 MySQL Shell
Git:Git Bash连接MySQL
Git:Git Bash连接MySQL
123 0
Git:Git Bash连接MySQL
|
Shell 开发工具 git
在 Git Bash 下设置命令行调用vscode
在Git Bash下使用命令指定一个程序打开文件的设置。今天在使用gitbash时,打开文件,每次都是终端和使用鼠标去打开文件两个状态间来回切换。感觉很不方便,要是能够用命令直接打开文件就好了。 下面设置Git Bash中使用vscode命令打开文件...
274 0
在 Git Bash 下设置命令行调用vscode
|
关系型数据库 MySQL Shell
Git:Git Bash连接MySQL
Git:Git Bash连接MySQL
76 0
Git:Git Bash连接MySQL
|
关系型数据库 MySQL Shell
Git:Git Bash连接MySQL
Git:Git Bash连接MySQL
238 0
Git:Git Bash连接MySQL
|
8月前
|
监控 安全 Shell
防止员工泄密的措施:在Linux环境下使用Bash脚本实现日志监控
在Linux环境下,为防止员工泄密,本文提出使用Bash脚本进行日志监控。脚本会定期检查系统日志文件,搜索敏感关键词(如"password"、"confidential"、"secret"),并将匹配项记录到临时日志文件。当检测到可疑活动时,脚本通过curl自动将数据POST到公司内部网站进行分析处理,增强信息安全防护。
199 0
|
8月前
|
Linux Shell Windows
4:Bash shell命令-步入Linux的现代方法
4:Bash shell命令-步入Linux的现代方法
112 0