首先為自己打個廣告,我目前在某互聯網公司做架構師,已經有5年經驗,每天都會寫架構師系列的文章,感興趣的朋友可以關注我和我一起探討,同時需要架構師資料的可以私信我免費送

前情回顧

在上一篇文章中我們介紹了第一種方式實現輕鬆擴展 GitBash 命令,首先簡單回顧一下主要知識.

GitBash 命令行工具是 Windows 電腦安裝 Git 時默認集成的終端工具,與此同時還有雙胞胎兄弟 GitGUI 圖形化工具.

GitBash 是終端工具,而 Windows 系統默認也有個 cmd 終端工具,這兩個命令行其實都可以運行 Git 相關命令,二者在這方面差異不大,使用哪一個都可以.

但是如果你更熟悉 linux 命令行語法的話,那麼肯定建議選擇 GitBash 命令行而不能是 cmd 命令行.

因為 windows 命令行語法和 linux 命令行語法差異還是比較大的.

當然, GitBashcmd 作為同類產品,兩者並不是互斥的,而應該是互補產品,某些情況下, GitBash 可能還需要調用 cmd 才能完成相應任務呢!

比如說 GitBash 默認沒有 tree 命令,而 cmd 命令行卻又,所以我們可以在 GitBash 中調用 cmd 幫我們執行 tree 命令.

GitBash 調用 cmd 程序執行相關命令時,請一定要以 winpty 開頭,不然可能會發生意想不到的結果.

問題背景

在上一篇文章結尾處,我們留下了一個問題,那就是: 如果 cmd 也沒有某些命令的話, GitBash 又該如何執行該命令?

正所謂"巧婦難為無米之炊", GitBash 命令行沒有 wget 命令, cmd 命令行也沒有 wget 命令,因此 GitBash 自然無法調用 wget 命令,那麼解決思路就很清楚了:

擴展 wget 命令並讓 GitBash 識別到 wget 命令文件唄!

還記得上篇文章中 GitBash 想要調用 cmdtree 命令,並不能直接 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 無法識別 .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 的過程中借鑒了大量的開源項目,包括 minGWmsys2 項目.

不查不知道,一查就發現了新大陸,原來想要把 linux 軟體移植到 windows 平台的做法並不孤單,甚至提出了 WSL 概念!

WSL : WindowsSubsystemForLinux 的縮寫,即為 linux 打造的 windows 子系統,可以簡單理解為在 windows系統上獲得 linux 系統的體驗.

所以, GitBash 背後的技術支持來源於 minGWmsys2WSL 項目.

既然, GitBash 默認沒有提供 tree 命令文件,那我們就自己動手去擴展 tree 命令.

由於暫時沒有找到 minGW 已編譯好的可執行文件,所以只能找其他 WSL 項目進行移植,親測可行!

GnuWin 項目源碼託管地址,其中 GnuWin64 是 64 位操作系統, GnuWin32 是 32 位操作系統,不過 GnuWin64 仍在開發計劃中,所以我們只能使用 GnuWin32 .

GnuWin64 : sourceforge.net/project

GnuWin32 : sourceforge.net/project

依次選擇 Files>tree>1.5.2.2 便可以找到 tree 命令文件,這裡提供了各種文件類型,既有源碼文件又要安裝文件,還有可執行的二進位文件.

tree-1.5.2.2-bin.zip 下載地址: sourceforge.net/project

二進位文件

接下來的事情就比較簡單了,將二進位文件 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 下載地址: sourceforge.net/project

雙擊可執行文件 wget-1.11.4-1-setup.exe,準備進行安裝!

接受協議,勾選我同意,並下一步.

選擇安裝的目標路徑,切記一定要安裝到 Gitusr 目錄下!!!

選擇安裝組件,默認選項即可.

選擇菜單目錄,建議設置成 GitWget .

選擇附加任務,默認選項即可.

確認安裝信息,這裡確認下安裝目錄是不是 Git 的安裝位置下面的 usr 目錄以及開始菜單目錄是不是 GitWget.

點擊下一步,等待安裝完成.

安裝完成後,再次查看 GitBashusr/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:Gitusrinwget??δ??? URL
?÷??? F:Gitusrinwget [???]... [URL]...

??????á?F:Gitusrinwget --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 命令(下).

從事Java已經5年,目前在某互聯網公司做就Java系統架構師,每天都會寫一些技術文章,感興趣的同事請關注我,謝謝。(需要架構資料私信我)


推薦閱讀:
相关文章