git bash
是 Windows
用戶安裝 git
時默認安裝的命令行工具,不只界面漂亮功能也不錯,大多數狀況下能夠替代 Windows
原生的 cmd
命令行.前端
然而,git bash
命令行不是萬金油,並不能徹底替代 cmd
,詳情請參考 mintty
官網的相關說明.java
mintty is not a full replacement for the Windows Console windownode
git bash
命令行默認使用 mintty
做爲終端模擬器,而 mintty
官宣表示本身不能徹底替代 cmd
,也就是說 git bash
可能不具有某些 cmd
命令.linux
舉個簡單的例子,若是想要查看當前目錄的文件結構,最好是以目錄樹的形式展示,聰明的你獲取已經猜到了tree
命令.git
git bash
命令行中輸入 tree
命令發現並沒有此命令.github
snowdreams1006@home MINGW64 /g/sublime/test
$ tree
bash: tree: command not found
複製代碼
爲了驗證,確實沒有 tree
命令,咱們直接打開 git bash
支持的命令文件目錄,查看到底有沒有 tree.exe
文件.web
在
git bash
桌面快捷方式右鍵,選擇打開文件位置,當前正處於git
的安裝目錄,進入.\usr\bin
文件夾.sql
通過驗證,git bash
支持的命令文件確實沒有發現 tree.exe
文件,所以真的不支持 tree
命令.shell
然而,cmd
自帶的命令行中輸入 tree
中居然發現可以輸出目錄樹,原來 cmd
支持 tree
命令.vim
G:\sublime\test>tree
卷 工做 的文件夾 PATH 列表
卷序列號爲 00000081 CC3C:50D0
G:.
├─cmd
└─git
複製代碼
tree
命令其實調用的是tree.com
並非常見的tree.exe
格式.
如今咱們已經知道 git bash
提供的終端模擬器不支持某些 linux
命令,可是爲何不支持以及如何才能支持這些命令呢?
這些問題必須等咱們弄清楚 mintty
的朋友圈關係才能更好地解決上述問題,接下來簡單科普下 mintty
的朋友圈.
關於科普知識的來源,請參考上一篇文章: <<git bash 背後的朋友圈>>
mintty
是什麼
Mintty
是Cygwin
,MSYS
或Msys2
的終端模擬器,派生項目和WSL
.
mintty
開源終端模擬器,基於 putty
的終端仿真和 Windows
前端頁面.
mintty
做爲一款優秀的終端模擬器,不只是其餘系統上默認的終端,也是 git bash
的默認終端.
$ mintty --help
Usage: mintty [OPTION]... [ PROGRAM [ARG]... | - ]
Start a new terminal session running the specified program or the user's shell. If a dash is given instead of a program, invoke the shell as a login shell. Options: -c, --config FILE Load specified config file -e, --exec Treat remaining arguments as the command to execute -h, --hold never|start|error|always Keep window open after command finishes -i, --icon FILE[,IX] Load window icon from file, optionally with index -l, --log FILE|- Log output to file or stdout -o, --option OPT=VAL Override config file option with given value -p, --position X,Y Open window at specified coordinates -s, --size COLS,ROWS Set screen size in characters -t, --title TITLE Set window title (default: the invoked command) -u, --utmp Create a utmp entry -w, --window normal|min|max|full|hide Set initial window state --class CLASS Set window class name (default: mintty) -H, --help Display help and exit -V, --version Print version information and exit 複製代碼
若是想要自定義 mintty
終端,在 git bash
命令行界面右鍵選擇選項設置便可打開設置頁面.
mingw
是什麼
mingw
是Minimalist GNU for Windows
的縮寫,是Microsoft Windows
應用程序的極簡主義開發環境.
msys
是什麼
MSYS
是Minimal SYStem
的縮寫,是Bourne Shell
命令行解釋器系統.做爲Microsoft
的cmd.exe
的替代品,它提供了一個通用的命令行環境,特別適合與MinGW
一塊兒使用,用於將許多開源應用程序移植到MS-Windows
平臺; 它是Cygwin-1.3
的輕量級分支,它包含一小部分Unix
工具,能夠幫助實現這一目標.
cygwin
是什麼大量
GNU
和開源工具,提供相似於Windows
上的Linux
發行版的功能.
gnu
是什麼
GNU
是GNU's Not Unix
的遞歸縮寫,是自由軟件操做系統.
git bash
採用 mintty
做爲終端模擬器,而 mintty
終端是 mingw
,msys2
和 cygwin
的默認終端,這些"操做系統"或多或少都是 GNU
的一部分.
GNU
是自由軟件運動的成果,提出自由軟件以及自由軟件操做系統概念,源碼開源發佈.
正因如此,江山代有才人出,前人栽樹後人乘涼,Cygwin
做爲 GNU
一員,提出了要在 Windows
打造出 Linux
的感受,開發出一套完整的解決方案.
或許因爲這套方案太完整,功能齊全於是軟件包體積龐大,所以 MinGW
和 MSYS
分別在其基於上進行精簡重構,保留最簡功能,發展出"極簡主義的GNU".
開源的力量是可持續的,慢慢的,這些操做系統的內置終端功能也被單獨提取出來,mintty
做爲他們的默認終端也逐漸獨立提供終端模擬器服務,輕鬆和各個系統進行安裝集成.
說到開源,天然是少不了 git
的身影,分佈式版本控制系統這種優秀工具應該造福全人類,然而 git
自己僅支持類 Unix
系統,並不提供 WIndows
系統的支持.
Git For Windows
組織出手增長了 git
對 Windows
系統的支持,背後的技術多半離不開上述介紹的 GNU
操做系統.
Git Bash Here
則是 Git For Windows
的命令行工具,使用的終端模擬器就是明星模擬器 mintty
.
弄清楚事情的前因後果後,對咱們解決問題有什麼幫助呢?
幫助可大了去了,刨根問題找到了源頭,問題天然迎刃而解!
你肯定不是在逗我?讓我直接放棄?
親,真的抱歉呢,放棄是解決問題的最快途徑!
...
談一談爲何要放棄?
git bash
命令行使用的是 mintty
終端,而 mintty
終端並不能徹底替代 cmd
,也沒有提供包管理工具供咱們擴展第三方命令.
因此默認狀況下,若是沒有提供某些命令,那咱們只好放棄在 git bash
命令行中使用這些命令.
此路不通,天然會尋求其餘解決途徑,好比能夠藉助 cmd
命令行或者其餘第三方軟件等,不必非要堅持使用git bash
!
既然本文是 tree
命令引起的討論,那就談點和主題有關的技能點,否則豈不是跑題了?
tree
命令雖然 git bash
不提供,可是 cmd
卻已經內置了.
值得注意的是,cmd
提供的 tree
命令比較特殊,並非常見的 .exe
結尾文件,而是 .com
結尾的文件.
因此 git bash
中輸入 tree
命令時,自身 /usr/bin
中沒有 tree.exe
文件,而系統中也沒有 tree.exe
命令,那麼就會提示找不到命令了啊!
那麼第一種調用方法即是補全後綴名,這樣天然可以調用 cmd
的 tree.com
命令.
git bash
並不識別.com
後綴的命令,輸入tree
命令時覺得是tree.exe
,實際上tree
命令應該是tree.com
的簡寫.
我擦,居然出現亂碼,根據我多年的開發經驗來看,亂碼問題多半是編碼問題致使的,那麼修改下終端的編碼設置應該就能解決問題.
在命令行窗口內右鍵彈出
mintty
終端的設置頁面,選擇文本(Text
)中本地化(Locale
)配置,選擇中文簡體(zh_CN
),字符集(Character set
)設置爲UTF-8
.
瞬間被打臉,不管是原來的git bash
命令行窗口仍是新開的命令行窗口,仍然仍是亂碼!
然而,我是不會認可被打臉的,世人皆醉我獨醒,確定是 bug
,哈哈!
其實,中文亂碼真的是
bug
,仍是官方承認的bug
喲,我並無被打臉呢,後續會介紹.
cmd
程序既然git bash
沒有提供 tree
命令,而恰巧 cmd
提供了 tree
命令,那爲什麼不假借他人之手實現本身的目的呢?
在 cmd
中使用 tree
命令直接輸入便可獲得目錄樹結構,可是如今須要在 git bash
中調用 cmd
中的 tree
命令.
# 直接輸入 `tree` 命令,正確響應而且無中文亂碼.
G:\sublime\test>tree
卷 工做 的文件夾 PATH 列表
卷序列號爲 00000093 CC3C:50D0
G:.
├─cmd
└─git
# 輸入 `cmd tree` 命令,雖無報錯,但也沒有正確響應.
G:\sublime\test>cmd tree
Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留全部權利。
複製代碼
cmd
中直接輸入tree
命令便可,無需經過cmd tree
這種方式,還覺得你要調用cmd
命令呢!
所以,咱們須要告訴git bash
要經過 cmd
去調用下 tree
命令.
# 注意看前綴是 `snowdreams1006@home MINGW64` 代表當前處於 `git bash` 環境
snowdreams1006@home MINGW64 /g/sublime/test
# 輸入 `cmd tree` 命令,雖無報錯,但也沒有正確響應,而且仍然有中文亂碼.
$ cmd tree
Microsoft Windows [▒汾 6.3.9600]
(c) 2013 Microsoft Corporation▒▒▒▒▒▒▒▒▒▒Ȩ▒▒▒▒
# 輸出 `tree` 命令,正確響應但有中文亂碼.此時命令行前綴已經更改成 `G:\sublime\test>` 代表當前再也不處於`git bash` 環境!
G:\sublime\test>tree
tree
▒▒ ▒▒▒▒ ▒▒▒ļ▒▒▒ PATH ▒б▒
▒▒▒▒▒к▒Ϊ 0000006B CC3C:50D0
G:.
▒▒▒▒cmd
▒▒▒▒git
複製代碼
經過上述操做結果來看,不難發現如下問題.
cmd tree
命令切換到 cmd
環境,而且tree
命令並無執行. 換句話說,cmd tree
和 cmd dir
或者 cmd
的做用相同,都是切換了當前 bash
環境.cmd
命令行運行 tree
可以獲得正確響應,但存在中文亂碼.cmd
環境,Ctrl + C
組合便可從新回到 git bash
環境.因而可知,不加任何參數冒昧進入到 cmd
環境仍是比較麻煩的,所以下面提供帶參數的命令幫助咱們閱後即焚.
cmd //c tree
命令,閱後即焚,表示執行完當即退出.
snowdreams1006@home MINGW64 /g/sublime/test
$ cmd //c tree
▒▒ ▒▒▒▒ ▒▒▒ļ▒▒▒ PATH ▒б▒
▒▒▒▒▒к▒Ϊ 00000008 CC3C:50D0
G:.
▒▒▒▒cmd
▒▒▒▒git
snowdreams1006@home MINGW64 /g/sublime/test
$
複製代碼
執行命令先後咱們都在
git bash
環境而且在cmd
中獲得正確響應結果,惟一的區別就是多加了//c
參數,表示執行完命令當即退出cmd
環境.
cmd
簡單總結下,如何在 git bash
中藉助 cmd
實現 tree
命令.
tree.com
: 補全調用命令後綴名,直接調用系統命令.cmd //c tree
: 藉助 cmd
運行 tree
命令,從而實現調用 tree
的目的.調用 tree
命令的目的已經達到,沒有解決的問題是中文亂碼.
解決問題最快速的方式是百度一下或者從官網尋求幫助,此次我選擇後者,由於百度一下人人都會,不用我再講了吧!
簡單解釋下這段話的意思:
若是在 mintty
終端調用原生 cmd
程序,簡單的輸出指令沒有什麼問題,交互指令可能存在問題. 所以建議使用 winpty
進行包裝再調用原生 cmd
程序.
winpty
是一種提供與cmd
通訊的軟件包,詳情請參考github.com/rprichard/w…
有什麼神奇之處?不妨加上 winpty
試試看!
snowdreams1006@home MINGW64 /g/sublime/test
# `winpty` + `tree.com` : 正常輸出且無中文亂碼
$ winpty tree.com
卷 工做 的文件夾 PATH 列表
卷序列號爲 00000074 CC3C:50D0
G:.
├─cmd
└─git
snowdreams1006@home MINGW64 /g/sublime/test
# `winpty` + `cmd //c tree` : 正常輸出且無中文亂碼
$ winpty cmd //c tree
卷 工做 的文件夾 PATH 列表
卷序列號爲 000000B3 CC3C:50D0
G:.
├─cmd
└─git
snowdreams1006@home MINGW64 /g/sublime/test
$
複製代碼
果真是神藥,一會兒就治好了我多年的老寒腿啊!
winpty tree.com
: 不叫小名而叫全稱,直接調用系統命令winpty cmd //c tree
: 假借他人之手,變相調用系統命令上文中說設置文件編碼應該可以解決中文亂碼問題結果仍然有亂碼,猜想是
bug
,如今沒有打臉吧?
既然已經提供瞭解決方案,那文章是否是應該到此爲止了呢?
不不不,遠遠還沒結束,這只是開胃小菜,好戲還在後頭呢.
更況且這命令也忒長了,記不住啊!
很簡單,能夠設置別名啊,把經常使用命令設置成別名,這樣就記住啦!
輸入 alias
命令沒有報錯,說明目前環境是支持設置別名的.
snowdreams1006@home MINGW64 /g/sublime/test
$ alias
alias ll='ls -l'
alias ls='ls -F --color=auto --show-control-chars'
alias node='winpty node.exe'
複製代碼
按照 linux
的操做習慣,命令行設置的通常都是臨時性的,想要永久生效,都要寫入到文件中,別名這種固然要一勞永逸設置成永久文件.
snowdreams1006@home MINGW64 /g/sublime/test
$ cat /etc/bashrc
cat: /etc/bashrc: No such file or directory
snowdreams1006@home MINGW64 /g/sublime/test
$ cat ~/.bashrc
cat: /c/Users/snowdreams1006/.bashrc: No such file or directory
複製代碼
居然配置文件都不存在?
固然不存在了啊!快醒醒,你是在 Windows
系統上並非 Linux
系統,上哪給你弄這些配置文件去?
腦海中迅速閃現哲學基本問題: 我是誰,我在那,我在幹什麼?
我是 Windows
系統用戶,正在 git bash
命令行中試圖設置別名,沒有找到相似於 linux
配置文件.
既然你明白你何出來,那你去那裏看看有沒有什麼發現?
snowdreams1006@home MINGW64 /g/sublime/test
$ cd /e/git
snowdreams1006@home MINGW64 /e/git
$ winpty tree.com
卷 軟件 的文件夾 PATH 列表
卷序列號爲 00000063 223E:7300
E:.
├─bin
├─cmd
├─dev
│ ├─mqueue
│ └─shm
├─etc
│ ├─pkcs11
│ ├─pki
│ │ └─ca-trust
│ │ ├─extracted
│ │ │ ├─java
│ │ │ ├─openssl
│ │ │ └─pem
│ │ └─source
│ │ └─anchors
│ ├─profile.d
│ └─ssh
├─mingw64
│ ├─bin
│ ├─doc
│ │ └─git-credential-manager
│ ├─etc
│ │ ├─pkcs11
│ │ └─pki
│ │ └─ca-trust
│ │ └─extracted
│ │ ├─java
│ │ ├─openssl
│ │ └─pem
│ ├─lib
│ │ ├─dde1.4
│ │ ├─engines
│ │ ├─itcl4.0.4
│ │ ├─p11-kit
│ │ ├─pkcs11
│ │ ├─reg1.3
│ │ ├─sqlite3.11.0
│ │ ├─tcl8
│ │ │ ├─8.4
│ │ │ │ └─platform
│ │ │ ├─8.5
│ │ │ └─8.6
│ │ │ └─tdbc
│ │ ├─tcl8.6
│ │ │ ├─encoding
│ │ │ ├─http1.0
│ │ │ ├─msgs
│ │ │ ├─opt0.4
│ │ │ └─tzdata
│ │ │ ├─Africa
│ │ │ ├─America
│ │ │ │ ├─Argentina
│ │ │ │ ├─Indiana
│ │ │ │ ├─Kentucky
│ │ │ │ └─North_Dakota
│ │ │ ├─Antarctica
│ │ │ ├─Arctic
│ │ │ ├─Asia
│ │ │ ├─Atlantic
│ │ │ ├─Australia
│ │ │ ├─Brazil
│ │ │ ├─Canada
│ │ │ ├─Chile
│ │ │ ├─Etc
│ │ │ ├─Europe
│ │ │ ├─Indian
│ │ │ ├─Mexico
│ │ │ ├─Pacific
│ │ │ ├─SystemV
│ │ │ └─US
│ │ ├─thread2.7.3
│ │ └─tk8.6
│ │ ├─demos
│ │ │ └─images
│ │ ├─images
│ │ ├─msgs
│ │ └─ttk
│ ├─libexec
│ │ └─git-core
│ │ └─mergetools
│ ├─share
│ │ ├─antiword
│ │ ├─doc
│ │ │ ├─connect
│ │ │ ├─git-doc
│ │ │ │ ├─howto
│ │ │ │ └─technical
│ │ │ └─nghttp2
│ │ ├─gettext-0.19.7
│ │ │ └─its
│ │ ├─git
│ │ │ ├─bindimage.txt
│ │ │ └─completion
│ │ ├─git-core
│ │ │ └─templates
│ │ │ ├─hooks
│ │ │ └─info
│ │ ├─git-gui
│ │ │ └─lib
│ │ ├─gitweb
│ │ │ └─static
│ │ ├─licenses
│ │ │ ├─bzip2
│ │ │ ├─expat
│ │ │ ├─gcc-libs
│ │ │ ├─gettext
│ │ │ │ ├─gettext-runtime
│ │ │ │ │ ├─intl
│ │ │ │ │ └─libasprintf
│ │ │ │ ├─gettext-tools
│ │ │ │ │ └─gnulib-lib
│ │ │ │ │ └─libxml
│ │ │ │ └─gnulib-local
│ │ │ │ └─lib
│ │ │ │ └─libxml
│ │ │ ├─libffi
│ │ │ ├─libiconv
│ │ │ │ └─libcharset
│ │ │ ├─libssh2
│ │ │ ├─libsystre
│ │ │ ├─libtasn1
│ │ │ ├─libtre
│ │ │ ├─libwinpthread
│ │ │ │ └─mingw-w64-libraries
│ │ │ │ └─winpthreads
│ │ │ ├─openssl
│ │ │ ├─wineditline
│ │ │ └─zlib
│ │ ├─nghttp2
│ │ ├─p11-kit
│ │ │ └─modules
│ │ ├─perl5
│ │ │ └─site_perl
│ │ │ └─Git
│ │ │ └─SVN
│ │ │ └─Memoize
│ │ └─pki
│ │ └─ca-trust-source
│ └─ssl
│ └─certs
├─tmp
└─usr
├─bin
│ ├─core_perl
│ └─vendor_perl
├─lib
│ ├─awk
│ ├─coreutils
│ ├─gawk
│ ├─gnupg
│ │ └─gnupg
│ ├─openssl
│ │ └─engines
│ ├─p11-kit
│ ├─perl5
│ │ ├─core_perl
│ │ │ ├─auto
│ │ │ │ ├─arybase
│ │ │ │ ├─attributes
│ │ │ │ ├─B
│ │ │ │ ├─Compress
│ │ │ │ │ └─Raw
│ │ │ │ │ ├─Bzip2
│ │ │ │ │ └─Zlib
│ │ │ │ ├─Cwd
│ │ │ │ ├─Data
│ │ │ │ │ └─Dumper
│ │ │ │ ├─DB_File
│ │ │ │ ├─Devel
│ │ │ │ │ ├─Peek
│ │ │ │ │ └─PPPort
│ │ │ │ ├─Digest
│ │ │ │ │ ├─MD5
│ │ │ │ │ └─SHA
│ │ │ │ ├─Encode
│ │ │ │ │ ├─Byte
│ │ │ │ │ ├─CN
│ │ │ │ │ ├─EBCDIC
│ │ │ │ │ ├─JP
│ │ │ │ │ ├─KR
│ │ │ │ │ ├─Symbol
│ │ │ │ │ ├─TW
│ │ │ │ │ └─Unicode
│ │ │ │ ├─Fcntl
│ │ │ │ ├─File
│ │ │ │ │ ├─DosGlob
│ │ │ │ │ └─Glob
│ │ │ │ ├─Filter
│ │ │ │ │ └─Util
│ │ │ │ │ └─Call
│ │ │ │ ├─GDBM_File
│ │ │ │ ├─Hash
│ │ │ │ │ └─Util
│ │ │ │ │ └─FieldHash
│ │ │ │ ├─I18N
│ │ │ │ │ └─Langinfo
│ │ │ │ ├─IO
│ │ │ │ ├─IPC
│ │ │ │ │ └─SysV
│ │ │ │ ├─List
│ │ │ │ │ └─Util
│ │ │ │ ├─Math
│ │ │ │ │ └─BigInt
│ │ │ │ │ └─FastCalc
│ │ │ │ ├─MIME
│ │ │ │ │ └─Base64
│ │ │ │ ├─mro
│ │ │ │ ├─NDBM_File
│ │ │ │ ├─ODBM_File
│ │ │ │ ├─Opcode
│ │ │ │ ├─PerlIO
│ │ │ │ │ ├─encoding
│ │ │ │ │ ├─mmap
│ │ │ │ │ ├─scalar
│ │ │ │ │ └─via
│ │ │ │ ├─POSIX
│ │ │ │ ├─re
│ │ │ │ ├─SDBM_File
│ │ │ │ ├─Socket
│ │ │ │ ├─Storable
│ │ │ │ ├─Sys
│ │ │ │ │ ├─Hostname
│ │ │ │ │ └─Syslog
│ │ │ │ ├─threads
│ │ │ │ │ └─shared
│ │ │ │ ├─Tie
│ │ │ │ │ └─Hash
│ │ │ │ │ └─NamedCapture
│ │ │ │ ├─Time
│ │ │ │ │ ├─HiRes
│ │ │ │ │ └─Piece
│ │ │ │ ├─Unicode
│ │ │ │ │ └─Collate
│ │ │ │ ├─Win32
│ │ │ │ ├─Win32API
│ │ │ │ │ └─File
│ │ │ │ └─Win32CORE
│ │ │ ├─B
│ │ │ ├─Compress
│ │ │ │ └─Raw
│ │ │ ├─CORE
│ │ │ ├─Data
│ │ │ ├─Devel
│ │ │ ├─Digest
│ │ │ ├─Encode
│ │ │ │ ├─CN
│ │ │ │ ├─JP
│ │ │ │ ├─KR
│ │ │ │ ├─MIME
│ │ │ │ │ └─Header
│ │ │ │ └─Unicode
│ │ │ ├─File
│ │ │ │ └─Spec
│ │ │ ├─Filter
│ │ │ │ └─Util
│ │ │ ├─Hash
│ │ │ │ └─Util
│ │ │ ├─I18N
│ │ │ ├─IO
│ │ │ │ └─Socket
│ │ │ ├─IPC
│ │ │ ├─List
│ │ │ │ └─Util
│ │ │ ├─Math
│ │ │ │ └─BigInt
│ │ │ ├─MIME
│ │ │ ├─PerlIO
│ │ │ ├─Scalar
│ │ │ ├─Sub
│ │ │ ├─Sys
│ │ │ ├─threads
│ │ │ ├─Tie
│ │ │ │ └─Hash
│ │ │ ├─Time
│ │ │ ├─Unicode
│ │ │ │ └─Collate
│ │ │ └─Win32API
│ │ └─vendor_perl
│ │ ├─auto
│ │ │ ├─HTML
│ │ │ │ └─Parser
│ │ │ ├─Net
│ │ │ │ └─SSLeay
│ │ │ ├─SVN
│ │ │ │ ├─_Client
│ │ │ │ ├─_Core
│ │ │ │ ├─_Delta
│ │ │ │ ├─_Fs
│ │ │ │ ├─_Ra
│ │ │ │ ├─_Repos
│ │ │ │ └─_Wc
│ │ │ └─Term
│ │ │ └─ReadKey
│ │ ├─HTML
│ │ ├─Net
│ │ │ └─SSLeay
│ │ ├─SVN
│ │ └─Term
│ ├─pkcs11
│ ├─sasl2
│ ├─ssh
│ ├─tar
│ └─terminfo
│ ├─63
│ ├─64
│ └─78
├─libexec
├─share
│ ├─bash-completion
│ │ └─completions
│ ├─cygwin
│ ├─git
│ ├─gnupg
│ ├─licenses
│ │ ├─curl
│ │ ├─dos2unix
│ │ ├─expat
│ │ ├─file
│ │ ├─gcc-libs
│ │ ├─libffi
│ │ ├─libsasl
│ │ ├─libsqlite
│ │ ├─libssh2
│ │ ├─mintty
│ │ ├─ncurses
│ │ ├─openssh
│ │ ├─openssl
│ │ ├─p11-kit
│ │ ├─perl-Net-SSLeay
│ │ ├─perl-TermReadKey
│ │ ├─unzip
│ │ ├─vim
│ │ └─zlib
│ ├─misc
│ ├─p11-kit
│ │ └─modules
│ ├─perl5
│ │ ├─core_perl
│ │ │ ├─App
│ │ │ │ └─Prove
│ │ │ │ └─State
│ │ │ │ └─Result
│ │ │ ├─Archive
│ │ │ │ └─Tar
│ │ │ ├─Attribute
│ │ │ ├─autodie
│ │ │ │ ├─exception
│ │ │ │ └─Scope
│ │ │ ├─B
│ │ │ ├─Carp
│ │ │ ├─Class
│ │ │ ├─Compress
│ │ │ ├─Config
│ │ │ │ └─Perl
│ │ │ ├─CPAN
│ │ │ │ ├─Exception
│ │ │ │ ├─FTP
│ │ │ │ ├─HTTP
│ │ │ │ ├─Kwalify
│ │ │ │ ├─LWP
│ │ │ │ ├─Meta
│ │ │ │ └─Plugin
│ │ │ ├─DBM_Filter
│ │ │ ├─Devel
│ │ │ ├─Digest
│ │ │ ├─Encode
│ │ │ ├─encoding
│ │ │ ├─Exporter
│ │ │ ├─ExtUtils
│ │ │ │ ├─CBuilder
│ │ │ │ │ └─Platform
│ │ │ │ │ └─Windows
│ │ │ │ ├─Command
│ │ │ │ ├─Constant
│ │ │ │ ├─Liblist
│ │ │ │ ├─MakeMaker
│ │ │ │ │ └─version
│ │ │ │ ├─ParseXS
│ │ │ │ └─Typemaps
│ │ │ ├─File
│ │ │ ├─Filter
│ │ │ ├─Getopt
│ │ │ ├─HTTP
│ │ │ ├─I18N
│ │ │ │ └─LangTags
│ │ │ ├─IO
│ │ │ │ ├─Compress
│ │ │ │ │ ├─Adapter
│ │ │ │ │ ├─Base
│ │ │ │ │ ├─Gzip
│ │ │ │ │ ├─Zip
│ │ │ │ │ └─Zlib
│ │ │ │ ├─Socket
│ │ │ │ └─Uncompress
│ │ │ │ └─Adapter
│ │ │ ├─IPC
│ │ │ ├─JSON
│ │ │ │ └─PP
│ │ │ ├─Locale
│ │ │ │ ├─Codes
│ │ │ │ └─Maketext
│ │ │ ├─Math
│ │ │ │ ├─BigFloat
│ │ │ │ └─BigInt
│ │ │ ├─Memoize
│ │ │ ├─Module
│ │ │ │ ├─CoreList
│ │ │ │ └─Load
│ │ │ ├─Net
│ │ │ │ └─FTP
│ │ │ ├─overload
│ │ │ ├─Params
│ │ │ ├─Parse
│ │ │ │ └─CPAN
│ │ │ ├─Perl
│ │ │ ├─PerlIO
│ │ │ │ └─via
│ │ │ ├─Pod
│ │ │ │ ├─Perldoc
│ │ │ │ ├─Simple
│ │ │ │ └─Text
│ │ │ ├─Search
│ │ │ ├─TAP
│ │ │ │ ├─Formatter
│ │ │ │ │ ├─Console
│ │ │ │ │ └─File
│ │ │ │ ├─Harness
│ │ │ │ └─Parser
│ │ │ │ ├─Iterator
│ │ │ │ ├─Result
│ │ │ │ ├─Scheduler
│ │ │ │ ├─SourceHandler
│ │ │ │ └─YAMLish
│ │ │ ├─Term
│ │ │ ├─Test
│ │ │ │ ├─Builder
│ │ │ │ │ ├─IO
│ │ │ │ │ └─Tester
│ │ │ │ ├─Tester
│ │ │ │ └─use
│ │ │ ├─Text
│ │ │ ├─Thread
│ │ │ ├─Tie
│ │ │ ├─Time
│ │ │ ├─Unicode
│ │ │ │ └─Collate
│ │ │ │ └─CJK
│ │ │ ├─unicore
│ │ │ │ ├─lib
│ │ │ │ │ ├─Age
│ │ │ │ │ ├─Alpha
│ │ │ │ │ ├─Bc
│ │ │ │ │ ├─BidiC
│ │ │ │ │ ├─BidiM
│ │ │ │ │ ├─Blk
│ │ │ │ │ ├─Bpt
│ │ │ │ │ ├─Cased
│ │ │ │ │ ├─Ccc
│ │ │ │ │ ├─CE
│ │ │ │ │ ├─CI
│ │ │ │ │ ├─CompEx
│ │ │ │ │ ├─CWCF
│ │ │ │ │ ├─CWCM
│ │ │ │ │ ├─CWKCF
│ │ │ │ │ ├─CWL
│ │ │ │ │ ├─CWT
│ │ │ │ │ ├─CWU
│ │ │ │ │ ├─Dash
│ │ │ │ │ ├─Dep
│ │ │ │ │ ├─DI
│ │ │ │ │ ├─Dia
│ │ │ │ │ ├─Dt
│ │ │ │ │ ├─Ea
│ │ │ │ │ ├─Ext
│ │ │ │ │ ├─Gc
│ │ │ │ │ ├─GCB
│ │ │ │ │ ├─GrBase
│ │ │ │ │ ├─Hex
│ │ │ │ │ ├─Hst
│ │ │ │ │ ├─Hyphen
│ │ │ │ │ ├─IDC
│ │ │ │ │ ├─Ideo
│ │ │ │ │ ├─IDS
│ │ │ │ │ ├─In
│ │ │ │ │ ├─Jg
│ │ │ │ │ ├─Jt
│ │ │ │ │ ├─Lb
│ │ │ │ │ ├─LOE
│ │ │ │ │ ├─Lower
│ │ │ │ │ ├─Math
│ │ │ │ │ ├─NChar
│ │ │ │ │ ├─NFCQC
│ │ │ │ │ ├─NFDQC
│ │ │ │ │ ├─NFKCQC
│ │ │ │ │ ├─NFKDQC
│ │ │ │ │ ├─Nt
│ │ │ │ │ ├─Nv
│ │ │ │ │ ├─PatSyn
│ │ │ │ │ ├─PatWS
│ │ │ │ │ ├─Perl
│ │ │ │ │ ├─QMark
│ │ │ │ │ ├─SB
│ │ │ │ │ ├─Sc
│ │ │ │ │ ├─Scx
│ │ │ │ │ ├─SD
│ │ │ │ │ ├─STerm
│ │ │ │ │ ├─Term
│ │ │ │ │ ├─UIdeo
│ │ │ │ │ ├─Upper
│ │ │ │ │ ├─WB
│ │ │ │ │ ├─XIDC
│ │ │ │ │ └─XIDS
│ │ │ │ └─To
│ │ │ ├─User
│ │ │ ├─version
│ │ │ ├─warnings
│ │ │ └─Win32API
│ │ │ └─File
│ │ └─vendor_perl
│ │ ├─Authen
│ │ │ └─SASL
│ │ │ └─Perl
│ │ ├─Convert
│ │ ├─Date
│ │ │ └─Language
│ │ ├─Encode
│ │ ├─Error
│ │ ├─File
│ │ ├─HTML
│ │ ├─HTTP
│ │ │ ├─Cookies
│ │ │ ├─Headers
│ │ │ └─Request
│ │ ├─IO
│ │ │ └─Socket
│ │ │ └─SSL
│ │ ├─LWP
│ │ │ ├─Authen
│ │ │ └─Protocol
│ │ ├─Mail
│ │ │ ├─Field
│ │ │ └─Mailer
│ │ ├─MIME
│ │ │ ├─Decoder
│ │ │ ├─Field
│ │ │ └─Parser
│ │ ├─Net
│ │ │ ├─HTTP
│ │ │ └─SMTP
│ │ ├─Time
│ │ ├─URI
│ │ │ ├─file
│ │ │ └─urn
│ │ └─WWW
│ │ └─RobotRules
│ ├─pki
│ │ └─ca-trust-source
│ ├─tabset
│ ├─terminfo
│ │ ├─63
│ │ ├─64
│ │ └─78
│ └─vim
│ └─vim74
│ ├─autoload
│ │ └─xml
│ ├─colors
│ ├─compiler
│ ├─doc
│ ├─ftplugin
│ ├─indent
│ ├─keymap
│ ├─macros
│ │ ├─hanoi
│ │ ├─life
│ │ ├─maze
│ │ └─urm
│ ├─pack
│ │ └─dist
│ │ └─opt
│ │ ├─dvorak
│ │ │ ├─dvorak
│ │ │ └─plugin
│ │ ├─editexisting
│ │ │ └─plugin
│ │ ├─justify
│ │ │ └─plugin
│ │ ├─matchit
│ │ │ ├─doc
│ │ │ └─plugin
│ │ ├─shellmenu
│ │ │ └─plugin
│ │ └─swapmouse
│ │ └─plugin
│ ├─plugin
│ ├─print
│ ├─spell
│ ├─syntax
│ ├─tools
│ └─tutor
└─ssl
├─certs
└─misc
複製代碼
看到熟悉的 ./etc/bash.bashrc
文件,頓時親切很多,設置一下別名再說.
snowdreams1006@home MINGW64 /e/git
$ echo "# Set alias for tree command" >> ./etc/bash.bashrc
snowdreams1006@home MINGW64 /e/git
$ echo "alias tree='winpty tree.com'" >> ./etc/bash.bashrc
snowdreams1006@home MINGW64 /e/git
$ source ./etc/bash.bashrc
複製代碼
如今測試一下可否正確打印出目錄樹:
snowdreams1006@home MINGW64 /e/git
$ cd /g/sublime/test
snowdreams1006@home MINGW64 /g/sublime/test
$ tree
卷 工做 的文件夾 PATH 列表
卷序列號爲 000000A3 CC3C:50D0
G:.
├─cmd
└─git
複製代碼
親測有效,經過設置別名的方式能夠簡化命令,從而實如今 git bash
中優雅調用 tree
命令.
少年既然不聽勸,那我只好和你一塊兒獨斷獨行.
git bash
不支持 tree
命令,意味着 mintty
終端不支持 tree
命令,但 mintty
既然做爲一款優秀的終端模擬器不可能不支持 tree
命令,不然 cygwin
,msys2
和 mingw
等系統不可能將其做爲默認終端.
回想起 linux
系統,最小化安裝版也不支持 tree
命令,經過包管理工具自行擴展便可支持 tree
命令.
所以,思路有兩種,像 linux
那樣經過包管理工具安裝 tree
命令,或者經過源碼編譯方式擴展 tree
命令.
第一種須要包管理工具,而git bash
使用的是 mintty
終端,並無提供相應的包管理工具. 因此想要經過包管理工具進行安裝 tree
命令也是無路可走.
若是可以提供包管理工具,那麼咱們就能夠像 linux
系統那樣安裝第三方命令同樣,安裝 tree
命令了.
首先想到的是 mintty
官網有沒有相關說明,遺憾的是,mintty
自己通常是經過包管理工具安裝的,單獨的終端並無包管理的環境,所以沒法調用相關命令.
Administrator@snowdreams1006 MINGW64 /f/workspace/test
$ mingw-get
bash: mingw-get: command not found
Administrator@snowdreams1006 MINGW64 /f/workspace/test
$ pacman
bash: pacman: command not found
複製代碼
然而,小小的挫折是不會輕易放棄的,既然 mintty
官網不能提供有效的幫助,那咱們回到最初安裝 git
的地方,看一下 git
可否提供相關的包管理工具.
頻繁出現 Git For Windows
名詞,根據軟件的命令規則,Git for Windows
多是獨立的軟件,更況且 git bash
集成的終端也不是自身研發的終端而是第三方的 mintty
終端.
因此,咱們有理由相信 Git for Windows
是另外的團隊在維護,而不是 Git
團隊.
git-for-windows
官網: gitforwindows.org/
根據官方說明,安裝後正在下載相關依賴,下載速度比較慢的話,請自行解決.
下載完成後,原來的 cmd
窗口會自動關閉而且打開新的 git bash
窗口.
Administrator@snowdreams1006 MINGW64 / (master)
$ sdk help
The 'sdk' shell function helps you to get up and running
with the Git for Windows SDK. The available subcommands are:
create-desktop-icon: install a desktop icon that starts the Git for
Windows SDK Bash.
cd <project>: initialize/update a worktree and cd into it. Known projects:
git git-extra msys2-runtime installer build-extra
MINGW-packages MSYS2-packages mingw-w64-busybox mingw-w64-curl
mingw-w64-cv2pdb mingw-w64-git mingw-w64-git-credential-manager
mingw-w64-git-lfs mingw-w64-git-sizer mingw-w64-wintoast bash
curl gawk git-flow gnupg heimdal mintty nodejs openssh openssl
perl perl-HTML-Parser perl-Locale-Gettext perl-Net-SSLeay
perl-TermReadKey perl-XML-Parser perl-YAML-Syck subversion tig
init <project>: initialize and/or update a worktree. Known projects
are the same as for the 'cd' command.
build <project>: builds one of the following:
git-and-installer git git-extra msys2-runtime installer
mingw-w64-busybox mingw-w64-curl mingw-w64-cv2pdb mingw-w64-git
mingw-w64-git-credential-manager mingw-w64-git-lfs
mingw-w64-git-sizer mingw-w64-wintoast bash curl gawk
git-flow gnupg heimdal mintty nodejs openssh openssl
perl perl-HTML-Parser perl-Locale-Gettext perl-Net-SSLeay
perl-TermReadKey perl-XML-Parser perl-YAML-Syck subversion tig
edit <file>: edit a well-known file. Well-known files are:
git-sdk.sh sdk.completion ReleaseNotes.md install.iss
reload: reload the 'sdk' function.
複製代碼
如今安裝完成後,咱們再次打開 Git for Windows
的開發文檔簡介,從中不難發現該項目使用了 MSYS2
項目,那麼問題迎刃而解.
根據科普知識,咱們知道 MSYS2
和 MinGW
都是操做系統,而 Git For Windows
將二者結合在一塊兒,默認使用 MSYS2
的包管理工具.
Administrator@snowdreams1006 MINGW64 / (master)
$ Pacman -h
用法: Pacman <操做> [...]
操做:
Pacman {-h --help}
Pacman {-V --version}
Pacman {-D --database} <選項> <軟件包>
Pacman {-F --files} [選項] [軟件包]
Pacman {-Q --query} [選項] [軟件包]
Pacman {-R --remove} [選項] <軟件包>
Pacman {-S --sync} [選項] [軟件包]
Pacman {-T --deptest} [選項] [軟件包]
Pacman {-U --upgrade} [選項] <文件>
使用 'Pacman {-h --help}' 及某個操做以查看可用選項
複製代碼
激動人心的時刻就要來臨,在正式使用 Pacman
安裝 tree
命令外,咱們再次檢查當前系統環境以確保沒有 git bash
沒法調用 tree
命令.
Administrator@snowdreams1006 MINGW64 / (master)
$ tree
bash: tree: 未找到命令
複製代碼
調用 Pacman -S tree
命令安裝 tree
命令.
Administrator@snowdreams1006 MINGW64 / (master)
$ Pacman -S tree
正在解析依賴關係...
正在查找軟件包衝突...
軟件包 (1) tree-1.8.0-1
下載大小: 0.05 MiB
所有安裝大小: 0.07 MiB
:: 進行安裝嗎? [Y/n] y
警告:沒有 /var/cache/pacman/pkg/ 緩存存在,正在建立...
:: 正在獲取軟件包......
tree-1.8.0-1-x86_64 51.1 KiB 211K/s 00:00 [#####################] 100%
(1/1) 正在檢查密鑰環裏的密鑰 [#####################] 100%
(1/1) 正在檢查軟件包完整性 [#####################] 100%
(1/1) 正在加載軟件包文件 [#####################] 100%
(1/1) 正在檢查文件衝突 [#####################] 100%
(1/1) 正在檢查可用存儲空間 [#####################] 100%
:: 正在處理軟件包的變化...
(1/1) 正在安裝 tree
複製代碼
驗證安裝成功,切換到測試目錄調用 tree
命令真的打印出了目錄樹結構.
Administrator@snowdreams1006 MINGW64 / (master)
$ pwd
/
Administrator@snowdreams1006 MINGW64 / (master)
$ cd /f/workspace/test
Administrator@snowdreams1006 MINGW64 /f/workspace/test
$ tree
.
├── cmd
└── gitbash
2 directories, 0 files
複製代碼
tree.exe
文件確實已經存在,經過這樣方式固然能夠安裝任意第三方命令了呢!
Administrator@snowdreams1006 MINGW64 / (master)
$ pwd
/
Administrator@snowdreams1006 MINGW64 / (master)
$ ls usr/bin/tree.exe
usr/bin/tree.exe*
Administrator@snowdreams1006 MINGW64 / (master)
$ ls usr/bin/tree.exe
usr/bin/tree.exe*
複製代碼
然而,事情尚未結束,雖然打印當前路徑顯示的是在 /
,可是若是從普通的 git bash
命令行窗口進入 /
,發現他們並不一致!
開發版左上角文字:
SDK-64
,普通版左上角:MinGW64
.
事情應該不至於這麼複雜,我猜想若是進入到 git sdk
的安裝目錄,應該是同樣的!
還有一種源碼編譯安裝方式,能夠猜測到的是將會比較麻煩,不只要安裝 c
編譯環境,還可能會面臨如何移植到 Windows
環境的問題.
恕再下先行一步,告辭!
可是老司機怎麼能收走就走,不是說好一塊兒闖天下得嘛?
然而,愛莫能助,編譯安裝再到測試確實是很多挑戰,最重要的是,電腦太卡了等不了.
因此,收集到了一些資料方便有條件的小夥伴去研究吧!
mingw
,msys2
或者 cygwin
系統上編譯安裝 tree
的 c
文件,最終生成 tree.exe
可執行文件.c
編譯環境,生成的 tree.exe
可執行文件再想辦法兼容到 git bash
所支持的 .exe
類型,或許也不用轉換.linux
系統的 tree
命令源碼: mama.indstate.edu/users/ice/t…我以爲我還能夠再堅持一會,雖然不能從頭開始編譯生成 tree.exe
可執行文件,可是研究了這麼多朋友圈關係,足夠我找到解決方案了.
tree
命令的源碼文件編譯成 tree.exe
可執行文件比較費勁,可是能夠找到已經編譯好的文件啊.
說道這裏,不得不提一下神奇的 sourceforge 網站,提供源碼和下載網站.
前面咱們一直在說 mintty
終端模擬器也好,或者 mingw
,msys2
和 cygwin
操做系統也罷,他們或多或少和 GNU
有一些聯繫,而 GNU
是自由軟件操做系統,源碼會隨程序一同發佈.
因此咱們應該能夠從 sourceforge
網站上找到些蛛絲馬跡,說不定還有打包好的可執行文件呢,若是那樣的話就不用咱們手動編譯安裝了!
功夫不負有心人,居然真的找到了,搜索 GNU
發現了 gnuwin32
項目,完整提供了原生命令,其中就有咱們須要的 tree
命令.
因而下載二進制文件找到其中的 /bin/tree.exe
並將其複製到 /git/usr/bin
目錄下,這樣 git bash
自己就支持 tree
命令了.
首先清除掉上一步設置的別名,防止干擾以確保此二進制文件真實有效.
snowdreams1006@home MINGW64 /g/sublime/test
# 切換到 `git` 安裝目錄
$ cd /e/git
snowdreams1006@home MINGW64 /e/git
# 編輯 `bash.bashrc` 配置文件,移除別名
$ vim ./etc/bash.bashrc
snowdreams1006@home MINGW64 /e/git
# 查看配置文件內容,別名設置已移除
$ tail ./etc/bash.bashrc
[[ "$-" != *i* ]] && return
# Set a default prompt of: user@host, MSYSTEM variable, and current_directory
#PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\n\$ '
# Uncomment to use the terminal colours set in DIR_COLORS
# eval "$(dircolors -b /etc/DIR_COLORS)"
# Fixup git-bash in non login env
shopt -q login_shell || . /etc/profile.d/git-prompt.sh
snowdreams1006@home MINGW64 /e/git
# 刷新配置文件,使其當即生效
$ source ./etc/bash.bashrc
snowdreams1006@home MINGW64 /e/git
# 移除 `tree` 別名,適用於命令行方式設置而不是文件設置
$ unalias tree
snowdreams1006@home MINGW64 /e/git
# 運行 `tree` 命令,確保已經沒法經過別名方式調用系統的 `tree.com` 命令
$ tree
bash: tree: command not found
複製代碼
真的成功添加了 tree.exe
命令,明顯和 cmd
自帶的 tree.com
命令不一致.
snowdreams1006@home MINGW64 /e/git
$ cd /g/sublime/test
snowdreams1006@home MINGW64 /g/sublime/test
# 擴展命令 `tree` 幫助信息
$ tree.exe --help
usage: tree [-adfghilnpqrstuvxACDFNS] [-H baseHREF] [-T title ] [-L level [-R]]
[-P pattern] [-I pattern] [-o filename] [--version] [--help] [--inodes]
[--device] [--noreport] [--nolinks] [--dirsfirst] [--charset charset]
[--filelimit #] [<directory list>]
-a All files are listed.
-d List directories only.
-l Follow symbolic links like directories.
-f Print the full path prefix for each file.
-i Don't print indentation lines. -q Print non-printable characters as '?'. -N Print non-printable characters as is. -p Print the protections for each file. -u Displays file owner or UID number. -g Displays file group owner or GID number. -s Print the size in bytes of each file. -h Print the size in a more human readable way. -D Print the date of last modification. -F Appends '/', '=', '*', or '|' as per ls -F. -v Sort files alphanumerically by version. -r Sort files in reverse alphanumeric order. -t Sort files by last modification time. -x Stay on current filesystem only. -L level Descend only level directories deep. -A Print ANSI lines graphic indentation lines. -S Print with ASCII graphics indentation lines. -n Turn colorization off always (-C overrides). -C Turn colorization on always. -P pattern List only those files that match the pattern given. -I pattern Do not list files that match the given pattern. -H baseHREF Prints out HTML format with baseHREF as top directory. -T string Replace the default HTML title and H1 header with string. -R Rerun tree when max dir level reached. -o file Output to file instead of stdout. --inodes Print inode number of each file. --device Print device ID number to which each file belongs. --noreport Turn off file/directory count at end of tree listing. --nolinks Turn off hyperlinks in HTML output. --dirsfirst List directories before files. --charset X Use charset X for HTML and indentation line output. --filelimit # Do not descend dirs with more than # files in them. snowdreams1006@home MINGW64 /g/sublime/test # 原生 `tree.com` 幫助信息 $ winpty tree.com /? 卷 軟件 的文件夾 PATH 列表 卷序列號爲 000000CA 223E:7300 E:\GIT\? 無效的路徑 - \GIT\? 沒有子文件夾 複製代碼
雖然原生 cmd
自帶的 tree.com
命令也能打印出目錄結構樹,可是和擴展的第三方 tree.exe
命令相比,可配置的選項實在太少,難怪執拗少年會執意擴展 tree
命令.
若是想要在 git bash
命令行中調用 tree
命令,總結了下列幾種方法.
注意: 從上到下逐漸複雜,根據本身的狀況自行選擇.
winpty tree.com
: 直接調用 cmd
內置 tree.com
命令.winpty cmd //c tree
: 通知 cmd
調用 tree
命令.Git For Windows
開發版,Pacman -S tree
安裝 tree
命令,而後執行 tree
調用.tree.exe
文件到 git bash
安裝目錄下的 /usr/bin
目錄,而後執行 tree
命令.Git
自己並不支持 Windows
系統,Git For Windows
團隊爲了移植到 Windows
平臺,付出了不少努力,最直觀的感覺就是提供了 Git For Windows
軟件.
因爲 Git for Windows
的出色工做獲得 Git
的官方承認,如今默認下載的 Git
就是來源於 Git for Windows
.
但 Git
底層是運行在類 linux
系統的,這種差別必然須要 Windows
到 Linux
的中間處理層進行轉換.
所以,Git for Window
背後的技術中涉及到大量的 GNU
自由軟件操做系統和 WSL
(Windows Subsystem for Linux
) 的相關代碼.
正是因爲背後千絲萬縷的聯繫,爲咱們擴展 git bash
命令行提供了一些思路.
基於 Cygwin
系統進行擴展,安裝完整的操做系統,模擬出 linux
運行環境,在 Windows
上也能找到 linux
的感受.
固然,Cygwin
因爲比較完整,體積也至關大,因此在此衍生出 MSYS2
和 MinGW
操做系統.
異曲同工,他們的底層架構有些不一樣,但目的是一致的,都是在 Windows
上找到 Linux
的感受,而且他們的終端命令行幾乎都是 mintty
.
在終端中調用各自的包管理工具便可輕鬆擴展第三方命令,此外,因爲他們大多數都有 c
編譯環境,所以也能夠選擇從新編譯安裝.
因此 git bash
命令行看起來下像是 git
官方支持,其實倒是由 Git for Windows
組織獨立維護的開源項目.
默認 Git for Windows
沒有提供包管理工具,開發版卻默認集成了 MSYS2
環境.也就是說咱們能夠用 Pacman
來安裝 tree
命令.
最後稍微總結本文知識要點:
git bash
命令行並不能徹底替代 cmd
命令,二者互補才能相得益彰.git bash
命令行中調用 cmd
程序須要經過 winpty
調用,好比 winpty tree.com
git bash
默認安裝程序無包管理工具等高級功能,如需擴展自定義命令應該下載Git for Windows SDK
.git bash
環境兼容 MSYS2
,MinGW
,Cygwin
等系列自由軟件,其餘相似系統的 tree.exe
可能並不支持.好了,說了這麼多,小夥伴們 get 到如何在 git bash
使用(擴展) tree
命令了嗎?
若有疑問,歡迎留言告訴我!