像大部分 *nix 用戶,,我之前用 bash 很多年,,期間也有過小的不爽,但一直都忍過來,,或者是說沒想過這些不爽的地方能解決,,比如 cd
到一個(gè)深目錄時(shí)得哐哐猛敲 <TAB>
。這么多年里我也嘗試過其他 shell,。比如 ksh/tcsh 以及今天要說的 zsh,,但最終都沒堅(jiān)持下去,因?yàn)樾闹惺冀K還是認(rèn)為 bash 是最正統(tǒng)的 shell,,不愿意去主動(dòng)深入學(xué)習(xí)其他 shell,。直到前幾天逛 github,發(fā)現(xiàn) 排名第 6 的開源項(xiàng)目 oh-my-zsh,,下來試用了一把,,頓時(shí)覺得 bash 各種操作不爽到無法忍受。
放棄 bash 的各種內(nèi)牛滿面的理由
這里有個(gè) youtube 上的視頻,,短短 4 分鐘就已經(jīng)拋出了幾十個(gè)讓 bash 用戶切換到 zsh 中的理由,。視頻鏈接
理由 0:zsh 兼容 bash
兼容 bash 意味著我不需要太多學(xué)習(xí)成本就可以切換過來,意味著我以前在 bash 下積累的 shell 語法,、基本操作都不會(huì)荒廢,。在我心里 bash 還是最通用和標(biāo)準(zhǔn)的 shell 環(huán)境,因此兼容 bash 讓我切換到 zsh 時(shí)沒有太多后顧之憂,。
理由 1:zsh 的補(bǔ)全模式更方便
zsh 中按兩下 tab 鍵可以觸發(fā) zsh 的補(bǔ)全,,所有待補(bǔ)全項(xiàng)都可以通過鍵盤方向鍵或者 <Ctrl-n/p/f/b>
來選擇。
理由 2:zsh 支持命令選項(xiàng)補(bǔ)全
zsh 除了支持目錄的補(bǔ)全,,還支持命令選項(xiàng)的補(bǔ)全,,例如 ls -<TAB><TAB>
會(huì)直接列出所有 ls
的參數(shù),再也不會(huì)出現(xiàn)一個(gè)命令打到一半,,忘記參數(shù)導(dǎo)致重開一個(gè) terminal man
一把,。
理由 3:zsh 支持命令參數(shù)補(bǔ)全
以前想 kill
掉一個(gè)進(jìn)程,我的做法是 ps aux | grep "進(jìn)程名"
然后記下 id,,再 kill id
,。在 zsh
下,只需要 kill 進(jìn)程名<TAB>
,,zsh
就會(huì)自動(dòng)補(bǔ)全進(jìn)程的 pid,。
其余我常用的補(bǔ)全還有:
ssh <TAB><TAB>
時(shí) zsh 會(huì)自動(dòng)列出你訪問過的主機(jī)和用戶名來補(bǔ)全ssh
的參數(shù)。brew install <TAB><TAB>
來補(bǔ)全軟件包名,,除了 homebrew 以外,,同樣支持 port/apt-get 等其他包管理器。
理由 4:zsh 支持更加聰明的目錄補(bǔ)全
以前比如想進(jìn)入一個(gè)比較深的目錄,比如 /Users/pw/workspace/project/src/main/webapps/static/js
,,就得在 bash 下面打半天,,不停的 tab 去補(bǔ)全一個(gè)正確的路徑出來。在 zsh 下,,只需要輸入每個(gè)路徑的頭字母然后 tab 一下: cd /u/p/w/p/s/m/w/s/j<TAB>
理由 5:zsh 強(qiáng)大的快速目錄切換
以前最苦逼的事情莫過于頻繁在兩個(gè)工作目錄下切換,,總要打一長串 cd
路徑。也嘗試過 popd
和 pushd
來解決這個(gè)問題,,但往往是目錄已經(jīng)切換了才想起來沒用 pushd
,。而 zsh 會(huì)記住你每一次切換的路徑,然后通過 1
來切換到你上一次訪問的路徑,,2
切換到上上次……一直到 9
,,還可以通過 d
查看目錄訪問歷史。
zsh 還可以配合 autojump 一起使用,,autojump 會(huì)記錄下每一個(gè)你訪問過的目錄,,然后通過 j
來快速跳轉(zhuǎn)。
理由 6:zsh 支持全局 alias 和后綴名 alias
bash 的 alias
只能做命令的縮寫,,而 zsh
更進(jìn)一步,,使 alias
可以縮寫命令的一部分,例如參數(shù)或環(huán)境變量設(shè)置,。
1 2 3 4 | $ alias -s log=less $ ~/package/tomcat/log/catalina.log # 相當(dāng)于 less ~/package/tomcat/log/catalina.log $ alias -g PR=http_proxy=127.0.0.1:8087 $ PR curl https://twitter.com # 相當(dāng)于 http_proxy=127.0.0.1:8087 curl https://twitter.com |
理由 7:zsh 有著豐富多彩的命令行提示符
bash 下通過設(shè)置 $PS1
已經(jīng)可以實(shí)現(xiàn)很豐富的提示符了,,而 zsh 更進(jìn)一步,可以實(shí)現(xiàn)諸如多行提示符,、提示符右對齊等功能,。oh-my-zsh
配置文件中提供了非常豐富的提示符 theme 供選擇,我使用的是 gentoo
主題,,比較簡潔,,還可以顯示當(dāng)前 git 倉庫的狀態(tài)。
理由 8:zsh 有更多優(yōu)雅的語法
例如修改 PATH
,,bash 下設(shè)置 $PATH
要求所有路徑都要寫在一行里,,目錄多了以后看起來就很難看。zsh 支持更加符合程序員審美觀的設(shè)置方式,。
1 2 3 4 5 | path=(
~/bin
$path
~/package/smartsprites/bin
)
|
安裝 zsh
Linux 用戶通過各自發(fā)行版的包管理器直接安裝即可,。
Mac 自帶一個(gè) 4.x.x 版本的 zsh,可以直接使用,,也可以通過 homebrew 安裝最近剛剛發(fā)布的 5.0.0 版本。推薦使用最新的 5.0 版本,,對多字節(jié)字符提供了完整的支持,,這一點(diǎn)對于國內(nèi)用戶來說很重要。詳細(xì)的 release note
設(shè)置為默認(rèn) shell
通過命令 chsh
修改默認(rèn)登錄 shell,需要注意的是,,如果通過 homebrew 安裝了最新版本的 zsh,,則需要 sudo
編輯 /etc/shells
加入一行 /usr/local/bin/zsh
。然后再通過 chsh
來修改默認(rèn) shell,,否則會(huì)提示 /usr/local/bin/zsh
不是合法的 shell,。
安裝 oh-my-zsh 配置
對于每一個(gè)像我這樣的 zsh 初級用戶來說,oh-my-zsh 就是救人于水火中的大殺器,,強(qiáng)烈建議使用此配置上手 zsh,。
作者提供了傻瓜安裝命令:
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
也可以手工安裝,具體步驟,。
幾個(gè)必備的插件
autojump
幫助快速目錄跳轉(zhuǎn)的小工具,。首先要安裝 autojump,然后在 .zshrc
中開啟 autojump 插件,。它會(huì)記錄下來每個(gè)你進(jìn)入過的目錄,,隨后通過 j 目錄名稱的一部分
就可快速跳轉(zhuǎn)到該目錄。 Youtube 視頻介紹
git
Git 命令補(bǔ)全,,除了可以補(bǔ)全 git 的子命令,、命令開關(guān)等常規(guī)補(bǔ)全項(xiàng)以外,還可以補(bǔ)全分支名等內(nèi)容,,用 git 必開的插件,。
osx
提供一些與 Mac OSX 系統(tǒng)交互的命令,比如:
- man-preview 通過 preview 程序查看一個(gè)命令的手冊,,例如
man-preview git
- quick-look 快速預(yù)覽文件
- pfd 返回當(dāng)前 finder 打開的文件夾的路徑
- cdf 切換到當(dāng)前 finder 所在的目錄
- FIN -