查看原文
其他

三招教你轻松扩展 git bash 命令(中)

雪之梦技术驿站 脚本之家 2021-06-29

脚本之家

你与百万开发者在一起

前情回顾

上一篇文章中我们介绍了第一种方式实现轻松扩展 GitBash 命令,首先简单回顾一下主要知识.

GitBash 命令行工具是 Windows 电脑安装 Git 时默认集成的终端工具,与此同时还有双胞胎兄弟 GitGUI 图形化工具.

GitBash 是终端工具,而 Windows 系统默认也有个 cmd 终端工具,这两个命令行其实都可以运行 Git 相关命令,二者在这方面差异不大,使用哪一个都可以.

但是如果你更熟悉 linux 命令行语法的话,那么肯定建议选择 GitBash 命令行而不能是 cmd 命令行.

因为 windows 命令行语法和 linux 命令行语法差异还是比较大的.

当然, GitBash 和 cmd 作为同类产品,两者并不是互斥的,而应该是互补产品,某些情况下, GitBash 可能还需要调用 cmd 才能完成相应任务呢!

比如说 GitBash 默认没有 tree 命令,而 cmd 命令行却又,所以我们可以在 GitBash 中调用 cmd 帮我们执行 tree 命令.

GitBash 调用 cmd 程序执行相关命令时,请一定要以 winpty 开头,不然可能会发生意想不到的结果.

问题背景

上一篇文章结尾处,我们留下了一个问题,那就是: 如果 cmd 也没有某些命令的话, GitBash 又该如何执行该命令?

正所谓"巧妇难为无米之炊", GitBash 命令行没有 wget 命令, cmd 命令行也没有 wget 命令,因此 GitBash 自然无法调用 wget 命令,那么解决思路就很清楚了:

扩展 wget 命令并让 GitBash 识别到 wget 命令文件呗!

还记得上篇文章中 GitBash 想要调用 cmd 的 tree 命令,并不能直接 winpty tree 而是 winpty tree.com .

  1. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  2. # 直接输入 ` tree` 命令会提示找不到该命令文件

  3. $ tree

  4. bash: /usr/bin/tree: No such file or directory


  5. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  6. # 输入 `tree.com` 命令则能调用该命令但会出现中文乱码

  7. $ tree.com

  8. ▒▒ ▒▒▒▒ ▒▒▒ļ▒▒▒ PATH ▒б▒

  9. ▒▒▒▒▒к▒Ϊ 62AE-62CA

  10. F:.

  11. ▒▒▒▒cmd

  12. ▒▒▒▒git-bash


  13. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  14. # 直接输入 `winpty tree` 命令依旧找不到该命令

  15. $ winpty tree

  16. winpty: error: cannot start 'tree': Not found in PATH


  17. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  18. # 输入 `winpty tree.com` 命令则正常调用该命令

  19. $ winpty tree.com

  20. 卷 常用 的文件夹 PATH 列表

  21. 卷序列号为 62AE-62CA

  22. F:.

  23. ├─cmd

  24. └─git-bash

从上述的例子中,我们不难总结出以下结论:

  • GitBash 无法识别 .com 后缀结尾的命令文件.

  • GitBash 调用 cmd 命令时应通过 winpty 包装器.

  • GitBash 查找命令文件的路径也是通过 PATH 环境变量设置的,只不过还有自己的命令文件路径.

探寻庐山真面目

GitBash 命令行语法不仅和 linux 语法一致,而且设计思想基本也差不多,我们知道在 linux 中有一句话可以概括整个系统核心: 一切皆文件

那么 GitBash 所支持的各种命令自然也是文件,只要找到了命令文件自然也就明白为什么不支持 tree 命令了,换句话说,下一步我们就知道如何才能支持 tree 命令.

在桌面上找到 GitBash 图标的快捷方式,选中该图标右键,然后选择打开文件位置,现在应该进入到 Git 的安装目录了.

接下来,进入 usr/bin 目录,你会发现所有可执行的命令文件,但是并找不到 tree.exe 文件,所以自然无法执行 tree 命令.

那么如果我们能够找到 tree.exe 文件并将该命令文件放到 usr/bin 目录下自然就能够正常调用 tree 命令了,但是我们又该去哪里找 tree.exe 文件呢?

轻松扩展 git bash 命令(中)

tree.exe 命令文件千千万,但是适合 GitBash 命令行运行的却并不是全部文件.

想要对症下药,自然要先弄清楚 GitBash 到底属于何门何派,应用了哪些技术栈,这样才能知己知彼,轻松扩展更多命令.

Git 原来是 linux 系统专属软件,后来由 GitforWindows 组织进行了移植,所以现在 Git 才能够支持 Windows系统.

GitforWindows 在移植 Git 的过程中借鉴了大量的开源项目,包括 minGW 和 msys2 项目.

不查不知道,一查就发现了新大陆,原来想要把 linux 软件移植到 windows 平台的做法并不孤单,甚至提出了 WSL 概念!

WSL : WindowsSubsystemForLinux 的缩写,即为 linux 打造的 windows 子系统,可以简单理解为在 windows系统上获得 linux 系统的体验.

所以, GitBash 背后的技术支持来源于 minGW 和 msys2 等 WSL 项目.

既然, GitBash 默认没有提供 tree 命令文件,那我们就自己动手去扩展 tree 命令.

由于暂时没有找到 minGW 已编译好的可执行文件,所以只能找其他 WSL 项目进行移植,亲测可行!

GnuWin 项目源码托管地址,其中 GnuWin64 是 64 位操作系统, GnuWin32 是 32 位操作系统,不过 GnuWin64 仍在开发计划中,所以我们只能使用 GnuWin32 .

GnuWin64 : https://sourceforge.net/projects/gnuwin64/

GnuWin32 : https://sourceforge.net/projects/gnuwin32/

依次选择 Files>tree>1.5.2.2 便可以找到 tree 命令文件,这里提供了各种文件类型,既有源码文件又要安装文件,还有可执行的二进制文件.

tree-1.5.2.2-bin.zip 下载地址: https://sourceforge.net/projects/gnuwin32/files/tree/1.5.2.2/tree-1.5.2.2-bin.zip/download

二进制文件

接下来的事情就比较简单了,将二进制文件 tree-1.5.2.2-bin.zip 解压,找到 tree.exe 文件并复制到 Git的安装目录下面的 usr/bin 目录中即可支持 tree 命令.

  1. Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin

  2. # 解压 `tree-1.5.2.2-bin.zip` 文件,查看文件目录,`tree.exe` 位于 `bin` 目录下.

  3. $ winpty tree.com

  4. 卷 常用 的文件夹 PATH 列表

  5. 卷序列号为 62AE-62CA

  6. F:.

  7. ├─bin

  8. ├─contrib

  9. │ └─tree

  10. │ └─1.5.2.2

  11. │ ├─tree-1.5.2.2

  12. │ └─tree-1.5.2.2-src

  13. ├─man

  14. │ └─cat1

  15. └─manifest

现在再次测试 tree 命令来一起见证奇迹吧!

  1. Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin

  2. # `tree` 命令等价于 `tree.exe` 命令,执行的正是我们刚刚扩展的 `tree-1.5.2.2-bin.zip` 二进制文件

  3. $ tree

  4. .

  5. ├── bin

  6. │   └── tree.exe

  7. ├── contrib

  8. │   └── tree

  9. │   └── 1.5.2.2

  10. │   ├── tree-1.5.2.2

  11. │   ├── tree-1.5.2.2-GnuWin32.README

  12. │   └── tree-1.5.2.2-src

  13. │   ├── CHANGES

  14. │   ├── INSTALL

  15. │   ├── LICENSE

  16. │   └── README

  17. ├── man

  18. │   └── cat1

  19. │   └── tree.1.txt

  20. └── manifest

  21. ├── tree-1.5.2.2-bin.mft

  22. └── tree-1.5.2.2-bin.ver


  23. 9 directories, 9 files

GitBash 扩展的 tree 命令的后缀名是 .exe ,而刚好能够识别,因此不必输入 tree.exe 命令.

安装文件

tree 命令本身比较简单,没有其他依赖,所以我们可以直接将二进制文件复制到目标目录中即可正常运行,但是有些命令依赖项比较多,简简单单复制二进制文件并不能正常运行.

有兴趣的小伙伴们可以试试将 wget 的二进制文件复制到目标目录下,看一下能否正常运行 wget 命令?

答案是: 不能!

所以这一次我们不再采用复制二进制文件方式,而是安装软件形式进行扩展 wget 命令.

wget-1.11.4-1-setup.exe 下载地址: https://sourceforge.net/projects/gnuwin32/files/wget/1.11.4-1/wget-1.11.4-1-setup.exe/download

双击可执行文件 wget-1.11.4-1-setup.exe,准备进行安装!

接受协议,勾选我同意,并下一步.

选择安装的目标路径,切记一定要安装到 Git\usr 目录下!!!

选择安装组件,默认选项即可.

选择菜单目录,建议设置成 Git\Wget .

选择附加任务,默认选项即可.

确认安装信息,这里确认下安装目录是不是 Git 的安装位置下面的 usr 目录以及开始菜单目录是不是 Git\Wget.

点击下一步,等待安装完成.

安装完成后,再次查看 GitBash 的 usr/bin 目录,发现 wget.exe 命令文件确实安装到该目录下.

安装成功后,测试一下看看到底能不能正常运行吧!

  1. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  2. # 当前文件目录,`tree` 调用的是刚刚扩展的 `tree` 命令

  3. $ tree

  4. .

  5. ├── cmd

  6. │   └── cmd.md

  7. └── git-bash

  8. └── git-bash.md


  9. 2 directories, 2 files


  10. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  11. # 直接输入 `wget` 出现中文乱码

  12. $ wget

  13. F:\Git\usr\bin\wget▒▒δָ▒▒ URL

  14. ▒÷▒▒▒ F:\Git\usr\bin\wget [ѡ▒▒]... [URL]...


  15. ▒볢▒▒ʹ▒á▒F:\Git\usr\bin\wget --help▒▒▒鿴▒▒▒▒▒ѡ▒

  16. SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc

  17. syswgetrc = F:\Git\usr/etc/wgetrc


  18. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  19. # 输入 `winpty wget www.baidu.com` 解决中文乱码问题并下载 `www.baidu.com` 网页

  20. $ winpty wget www.baidu.com

  21. SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc

  22. syswgetrc = F:\Git\usr/etc/wgetrc

  23. --2019-05-18 14:03:47-- http://www.baidu.com/

  24. 正在解析主机 www.baidu.com... 115.239.211.112, 115.239.210.27

  25. Connecting to www.baidu.com|115.239.211.112|:80... 已连接。

  26. 已发出 HTTP 请求,正在等待回应... 200 OK

  27. 长度:2381 (2.3K) [text/html]

  28. Saving to: `index.html'


  29. 100%[======================================>] 2,381 --.-K/s in 0s


  30. 2019-05-18 14:03:47 (87.2 MB/s) - `index.html' saved [2381/2381]



  31. Administrator@snowdreams1006 MINGW64 /f/workspace/test

  32. # 再次查看当前目录,`www.baidu.com` 网页已成功下载到当前目录.

  33. $ tree

  34. .

  35. ├── cmd

  36. │   └── cmd.md

  37. ├── git-bash

  38. │   └── git-bash.md

  39. └── index.html


  40. 2 directories, 3 files

源码文件

按理说应该也可以编译成功,不过将源码编译成可执行的二进制文件可能比较费劲,因此暂未测试.

如果小伙伴们感兴趣可以自行安装 c 环境编译安装试试看,编译成功后别忘了告诉我哟!

未完待续最后一招

现在我们已经学会了两种方式来扩展 GitBash 命令,分别是调用 cmd 以及按需扩展指定命令.

但是,这两种方法都有一定的局限性,方法一的局限性可以用方法二来解决,那方法二的局限性又体现在哪?

方法二属于缺啥补啥, GitBash 命令行没有 tree 命令,但 WSL 项目有编译好的 tree 二进制文件,所以直接拿来用即可. GitBash 命令行没有 wget 命令,但 WSL 项目有 wget 的安装文件,所以我们安装集成到 GitBash 即可.

那如果 WSL 没有目标命令呢?或者说找不到相应的 WSL 的目标命令文件呢?

难道就束手无策了吗?

不不不,还有最后一招,此招一出,惊天动地,相信你再也不会说无法扩展 GitBash 命令了!

由于篇幅有限,打算另开一篇文章单独阐述,敬请期待下一篇文章---轻松扩展 git bash 命令(下).

最后感谢阅读支持,如果有更好的解决方法,欢迎留言一起探讨,下次见!

本文作者:雪之梦技术驿站,你在互联网的路上匆匆而来,雪之梦技术驿站助你满载而去。

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。


写的不错?赞赏一下

长按扫码赞赏

●  中国网吧 20 年往事,端游式微、手游主宰

●  脚本之家粉丝福利,请查看!

●  地球程序员之神:没上过大学,曾拒盖茨的Offer,4代码农靠他吃饭

● 微软劝你别再使用 IE 浏览器

● 痛的不只是华为,这家西方公司卡住中国芯片的脖子

● 一个39岁程序员的应聘被拒

● 入行AI,程序员为什么要学习NLP?

●  五款主流Linux发行版性能对比,不求最强但求稳

小贴士

返回 上一级 搜索“Java 女程序员 大数据 留言送书 运维 算法 Chrome 黑客 Python JavaScript 人工智能 女朋友 MySQL 书籍 等关键词获取相关文章推荐。

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

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