像大部分 *nix 用戶,我之前用 bash 很多年,期間也有過小的不爽,但一直都忍過來,或者是說沒想過這些不爽的地方能解決,比如 cd
到一個深目錄時得哐哐猛敲 <TAB>
。這麼多年裡我也嘗試過其他 shell。比如 ksh/tcsh 以及今天要說的 zsh,但最終都沒堅持下去,因為心中始終還是認為 bash 是最正統的 shell,不願意去主動深入學習其他 shell。直到前幾天逛 GitHub,發現 排名第 6 的開源項目 oh-my-zsh,下來試用了一把,頓時覺得 bash 各種操作不爽到無法忍受。
放棄 bash 的各種內牛滿面的理由
這裡有個 youtube 上的視頻,短短 4 分鐘就已經拋出了幾十個讓 bash 用戶切換到 zsh 中的理由。視頻鏈接
理由 0:zsh 兼容 bash
兼容 bash 意味著我不需要太多學習成本就可以切換過來,意味著我以前在 bash 下積累的 shell 語法、基本操作都不會荒廢。在我心裡 bash 還是最通用和標準的 shell 環境,因此兼容 bash 讓我切換到 zsh 時沒有太多後顧之憂。
理由 1:zsh 的補全模式更方便
zsh 中按兩下 tab 鍵可以觸發 zsh 的補全,所有待補全項都可以通過鍵盤方向鍵或者 <Ctrl-n/p/f/b>
來選擇。
理由 2:zsh 支持命令選項補全
zsh 除了支持目錄的補全,還支持命令選項的補全,例如 ls -<TAB><TAB>
會直接列出所有 ls
的參數,再也不會出現一個命令打到一半,忘記參數導致重開一個 terminal man
一把。
理由 3:zsh 支持命令參數補全
以前想 kill
掉一個進程,我的做法是 ps aux | grep "進程名"
然後記下 id,再 kill id
。在 zsh
下,只需要 kill 進程名<TAB>
,zsh
就會自動補全進程的 pid。
其餘我常用的補全還有:
·ssh <TAB><TAB>
時 zsh 會自動列出你訪問過的主機和用戶名來補全 ssh
的參數。
·brew install <TAB><TAB>
來補全軟體包名,除了 homebrew 以外,同樣支持 port/apt-get 等其他包管理器。
理由 4:zsh 支持更加聰明的目錄補全
以前比如想進入一個比較深的目錄,比如 /Users/pw/workspace/project/src/main/webapps/static/js
,就得在 bash 下面打半天,不停的 tab 去補全一個正確的路徑出來。在 zsh 下,只需要輸入每個路徑的頭字母然後 tab 一下: cd /u/p/w/p/s/m/w/s/j<TAB>
理由 5:zsh 強大的快速目錄切換
以前最苦逼的事情莫過於頻繁在兩個工作目錄下切換,總要打一長串 cd
路徑。也嘗試過 popd
和 pushd
來解決這個問題,但往往是目錄已經切換了才想起來沒用 pushd
。而 zsh 會記住你每一次切換的路徑,然後通過 1
來切換到你上一次訪問的路徑,2
切換到上上次……一直到 9
,還可以通過 d
查看目錄訪問歷史。
zsh 還可以配合 autojump 一起使用,autojump 會記錄下每一個你訪問過的目錄,然後通過 j
來快速跳轉。
理由 6:zsh 支持全局 alias 和後綴名 alias
bash 的 alias
只能做命令的縮寫,而 zsh
更進一步,使 alias
可以縮寫命令的一部分,例如參數或環境變數設置。
1 2 3 4 | $ alias -s log= less $ ~ /package/tomcat/log/catalina .log # 相當於 less ~/package/tomcat/log/catalina.log $ alias -g PR=http_proxy=127.0.0.1:8087 $ PR curl https: //twitter .com # 相當於 http_proxy=127.0.0.1:8087 curl https://twitter.com |
[火星人 ] 使用 Zsh 的九個理由已經有396次圍觀