脚本之家
你与百万开发者在一起
前情回顾
在中我们介绍了第一种方式实现轻松扩展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.
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 直接输入 ` tree` 命令会提示找不到该命令文件
$ tree
bash: /usr/bin/tree: No such file or directory
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 输入 `tree.com` 命令则能调用该命令但会出现中文乱码
$ tree.com
▒▒ ▒▒▒▒ ▒▒▒ļ▒▒▒ PATH ▒б▒
▒▒▒▒▒к▒Ϊ 62AE-62CA
F:.
▒▒▒▒cmd
▒▒▒▒git-bash
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 直接输入 `winpty tree` 命令依旧找不到该命令
$ winpty tree
winpty: error: cannot start 'tree': Not found in PATH
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 输入 `winpty tree.com` 命令则正常调用该命令
$ winpty tree.com
卷 常用 的文件夹 PATH 列表
卷序列号为 62AE-62CA
F:.
├─cmd
└─git-bash
从上述的例子中,我们不难总结出以下结论:
探寻庐山真面目
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:
GnuWin32:
依次选择Files>tree>1.5.2.2便可以找到tree命令文件,这里提供了各种文件类型,既有源码文件又要安装文件,还有可执行的二进制文件.
tree-1.5.2.2-bin.zip下载地址:
二进制文件
接下来的事情就比较简单了,将二进制文件tree-1.5.2.2-bin.zip解压,找到tree.exe文件并复制到Git的安装目录下面的usr/bin目录中即可支持tree命令.
Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin
# 解压 `tree-1.5.2.2-bin.zip` 文件,查看文件目录,`tree.exe` 位于 `bin` 目录下.
$ winpty tree.com
卷 常用 的文件夹 PATH 列表
卷序列号为 62AE-62CA
F:.
├─bin
├─contrib
│ └─tree
│ └─1.5.2.2
│ ├─tree-1.5.2.2
│ └─tree-1.5.2.2-src
├─man
│ └─cat1
└─manifest
现在再次测试tree命令来一起见证奇迹吧!
Administrator@snowdreams1006 MINGW64 /f/Downloads/tree-1.5.2.2-bin
# `tree` 命令等价于 `tree.exe` 命令,执行的正是我们刚刚扩展的 `tree-1.5.2.2-bin.zip` 二进制文件
$ tree
.
├── bin
│ └── tree.exe
├── contrib
│ └── tree
│ └── 1.5.2.2
│ ├── tree-1.5.2.2
│ ├── tree-1.5.2.2-GnuWin32.README
│ └── tree-1.5.2.2-src
│ ├── CHANGES
│ ├── INSTALL
│ ├── LICENSE
│ └── README
├── man
│ └── cat1
│ └── tree.1.txt
└── manifest
├── tree-1.5.2.2-bin.mft
└── tree-1.5.2.2-bin.ver
9 directories, 9 files
GitBash扩展的tree命令的后缀名是.exe,而刚好能够识别,因此不必输入tree.exe命令.
安装文件
tree命令本身比较简单,没有其他依赖,所以我们可以直接将二进制文件复制到目标目录中即可正常运行,但是有些命令依赖项比较多,简简单单复制二进制文件并不能正常运行.
有兴趣的小伙伴们可以试试将wget的二进制文件复制到目标目录下,看一下能否正常运行wget命令?
答案是: 不能!
所以这一次我们不再采用复制二进制文件方式,而是安装软件形式进行扩展wget命令.
wget-1.11.4-1-setup.exe下载地址:
双击可执行文件wget-1.11.4-1-setup.exe,准备进行安装!
接受协议,勾选我同意,并下一步.
选择安装的目标路径,切记一定要安装到Gitusr目录下!!!
选择安装组件,默认选项即可.
选择菜单目录,建议设置成GitWget.
选择附加任务,默认选项即可.
确认安装信息,这里确认下安装目录是不是Git的安装位置下面的usr目录以及开始菜单目录是不是GitWget.
点击下一步,等待安装完成.
安装完成后,再次查看GitBash的usr/bin目录,发现wget.exe命令文件确实安装到该目录下.
安装成功后,测试一下看看到底能不能正常运行吧!
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 当前文件目录,`tree` 调用的是刚刚扩展的 `tree` 命令
$ tree
.
├── cmd
│ └── cmd.md
└── git-bash
└── git-bash.md
2 directories, 2 files
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 直接输入 `wget` 出现中文乱码
$ wget
F:Gitusrbinwget▒▒δָ▒▒ URL
▒÷▒▒▒ F:Gitusrbinwget [ѡ▒▒]... [URL]...
▒볢▒▒ʹ▒á▒F:Gitusrbinwget --help▒▒▒鿴▒▒▒▒▒ѡ▒
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = F:Gitusr/etc/wgetrc
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 输入 `winpty wget www.baidu.com` 解决中文乱码问题并下载 `www.baidu.com` 网页
$ winpty wget www.baidu.com
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = F:Gitusr/etc/wgetrc
--2019-05-18 14:03:47-- http://www.baidu.com/
正在解析主机 www.baidu.com... 115.239.211.112, 115.239.210.27
Connecting to www.baidu.com|115.239.211.112|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2381 (2.3K) [text/html]
Saving to: `index.html'
100%[======================================>] 2,381 --.-K/s in 0s
2019-05-18 14:03:47 (87.2 MB/s) - `index.html' saved [2381/2381]
Administrator@snowdreams1006 MINGW64 /f/workspace/test
# 再次查看当前目录,`www.baidu.com` 网页已成功下载到当前目录.
$ tree
.
├── cmd
│ └── cmd.md
├── git-bash
│ └── git-bash.md
└── index.html
2 directories, 3 files
源码文件
按理说应该也可以编译成功,不过将源码编译成可执行的二进制文件可能比较费劲,因此暂未测试.
如果小伙伴们感兴趣可以自行安装c环境编译安装试试看,编译成功后别忘了告诉我哟!
未完待续最后一招
现在我们已经学会了两种方式来扩展GitBash命令,分别是调用cmd以及按需扩展指定命令.
但是,这两种方法都有一定的局限性,方法一的局限性可以用方法二来解决,那方法二的局限性又体现在哪?
方法二属于缺啥补啥,GitBash命令行没有tree命令,但WSL项目有编译好的tree二进制文件,所以直接拿来用即可.GitBash命令行没有wget命令,但WSL项目有wget的安装文件,所以我们安装集成到GitBash即可.
那如果WSL没有目标命令呢?或者说找不到相应的WSL的目标命令文件呢?
难道就束手无策了吗?
不不不,还有最后一招,此招一出,惊天动地,相信你再也不会说无法扩展GitBash命令了!
由于篇幅有限,打算另开一篇文章单独阐述,敬请期待下一篇文章—轻松扩展git bash命令(下).
最后感谢阅读支持,如果有更好的解决方法,欢迎留言一起探讨,下次见!
本文作者:雪之梦技术驿站bin文件怎么解压,你在互联网的路上匆匆而来bin文件怎么解压,雪之梦技术驿站助你满载而去。
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,加站长微信免费获取积分,会员只需38元,全站资源免费下载 点击查看详情
站 长 微 信: thumbxmw