1. 程式人生 > 實用技巧 >shell之終極shell——zsh

shell之終極shell——zsh

快速瞭解Linux/Unix系統中最重要的概念——shell一文中,我們對shell進行了簡單的介紹。shell是Linux/Unix的一個外殼,它負責外界(使用者)與Linux核心的互動,接收使用者或其他應用程式的命令,然後把這些命令轉化成核心能理解的語言,傳給核心,核心是真正幹活的,幹完之後再把結果返回使用者或應用程式。

比如,用ls命令列舉當前目錄的檔案,用find命令查詢檔案,用cp命令拷貝檔案,用top命令檢視機器負載和程序等。最常見的bash就是shell的一種,也是 Linux下的預設shell程式,這篇主要介紹當下最熱門的shell——zsh,相比bash,它更強大,也更人性化,俗稱終極shell。

什麼是zsh?

對於經常在Linux環境下幹活的開發者來說,shell是我們使用最頻繁的程式了。而zsh屬於shell的一種,和bash 一樣,但比bash更好用,zsh完全相容bash,擁有極其豐富的外掛,其強大的自動補全引數、檔名以及自定義功能,可以大大提高我們使用Linux的效率

安裝zsh

Mac OS預裝了zsh,可跳過這一步;
Redhat Linux執行:sudo yum install zsh
Ubuntu Linux執行:sudo apt-get install zsh
Windows 請點右上角關閉。。。

安裝完成後設定當前使用者使用zsh:chsh -s /bin/zsh,根據提示輸入當前使用者的密碼就可以了。

安裝oh-my-zsh

zsh雖然好用,但直接用起來還是比較麻煩,不過幸運的是,已經有大神給我們配置好了一個很棒的框架:oh-my-zsh(github),專門為zsh打造,一條命令搞定安裝:

sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

如果wget報錯,也可手動安裝(須先安裝git,方法同zsh,替換成git即可):

git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

配置

zsh的配置主要集中在使用者當前目錄的.zshrc裡,用vim或你喜歡的其他編輯器開啟.zshrc,在最下面會發現這麼一行字:

# Customize to your needs…

可以在此處定義自己的環境變數和別名,當然,oh my zsh在安裝時已經自動讀取當前的環境變數並進行了設定,你可以繼續追加其他環境變數。

主題

oh-my-zsh提供了很多主題,主題的配置檔案在~/.zshrc檔案中可以看到,開啟該檔案,找到下面這行:

ZSH_THEME="robbyrussel"

這是預設主題,可以將值改為其它任意主題,oh-my-zsh的主題可以在這裡找到。改好儲存檔案後,執行source ~/.zshrc使配置生效。當然,你也可以直接將值設定為”random”也是可以的,以後每次登陸伺服器,oh-my-zsh會隨機選擇一個主題,總有一款適合你。

外掛

oh my zsh專案提供了完善的外掛體系,相關的檔案在~/.oh-my-zsh/plugins目錄下,預設提供了100多種,大家可以根據自己的實際學習和工作環境採用,想了解每個外掛的功能,只要開啟相關目錄下的zsh檔案看一下就知道了。外掛也是在.zshrc裡配置,找到plugins關鍵字,你就可以載入自己的外掛了,系統預設載入git,你可以在後面追加內容,如下:

plugins=(git zsh-syntax-highlighting zsh-autosuggestion autojump z)

優勢特色

命令提示

務必明確命令提示補全是兩個完全不同的系統!很多時候提示比補全更有用,例如:

你才輸入完 “tar”命令,後面就用灰色給你提示tar命令的引數,而且是隨著你動態輸入完每一個字母不斷修正變化:

比如你輸入到 - 後,沒有跟著它上面的提示,而是輸入了一個z字母,它馬上明白你是要解壓,不是壓縮,然後隨即給出你壓縮對應的命令提示。

這個命令提示是基於你的歷史命令資料庫進行分析的,隨著你輸入的命令越來越多,提示將會越來越準確和順手,某些不常輸入的命令特別管用,比如偶爾檢視下網絡卡配置:

剛輸入完:cat /etc/n,它後面已經猜出你可能要檢視網絡卡配置了,然後馬上給出你提示,用不著你TAB鍵補全半天。

如果你覺得它提示的正確,你可以CTRL+F表示採納,後面就會自動幫你一次性全部輸入完了,不用一個字一個字地照著敲。前面的高亮就不說了,用慣這套提示系統,你就再也難以回到光禿禿的bash時代了。

智慧補全

縮寫路徑補全是zsh的一大特色,特別是路徑比較長的時候,比如Mac OS下工具鏈層層套的那種路徑,比如某java程式碼樹,有了這種縮寫補全,能讓你切換路徑流暢不少:

當補全內容較多時,不用像bash一樣持續提示你需要繼續輸入,也不會像cmd永無止境的迴圈下去,連續敲擊兩次TAB鍵zsh給你一個補全目錄,讓你上下左右選擇:

這叫選擇模式,由兩次連續TAB進入,進入後,除了TAB/SHIFT+TAB可以前後切換外,你還可以使用游標鍵上下左右移動,或者使用emacs鍵位:CTRL + f/b/p/n (左右上下:forward, backward, previous, next) 。如果你覺得游標鍵太遠難按,CTRL+f/b/p/n太傷小拇指,也可以新定義一套,比如:ALT+hjkl(左下上右)來選擇,十分順手。回車表示確認選擇,用CTRL+G表示退出。

命令引數補全更不在話下,輸入tar後面按一次TAB:

不僅一級引數可以補全,更常用的是二級引數補全。這時候兩次TAB進入選擇模式就比較管用了,選擇完回車確認,或者CTRL+G退出選擇模式。

快速跳轉

cd -:切換至最近路徑

命令列工作中,不同的路徑間切來切去是個頭疼的問題,除了上面提到的縮寫補全外,也可以使用cd -切換到最近跳轉過的某個路徑

輸入cd後面加一個減號“-”後,按一次TAB馬上就列出本次登陸後去過的最近幾次路徑,接著根據下面的提示輸入數字按回車就過去了,比如輸入:$ cd -5 <回車>就跳轉到~/.oh-my-zsh/plugins路徑下了。當然你還可以不輸入數字,而是再按一次tab進入選擇模式,上下鍵或者CTRL+n/p來選擇,回車確認,CTRL+G返回。

有了前面的路徑縮寫展開,和上面的最近訪問路徑切換,能否更進一步,不限於本次登陸或者最近去過的幾級路徑,而讓我快速進入自開始用zsh之後進入過的某個路徑呢?當然可以,我們使用z命令,檢視歷史上進入過的目錄。

d:跳轉最近歷史目錄

d命令會列出我們最近進入的目錄歷史,並且會給這些目錄加上序號,只需要輸入對應目錄的序號,即可重新進入該目錄,如下圖所示:

其中序號為1的目錄是我的SU目錄,直接輸入1,立馬跳回到SU所在目錄。

下一節還會介紹兩種跳轉類外掛z和autojump。

熱鍵繫結

zsh裡面使用bindkey命令可以設定一系列熱鍵,用來執行某一個zsh內部命令或者某個shell命令。比如從網上下載了一個tar包解開後要稍微瀏覽一下里面的內容,用的最多的兩條命令是啥呢?第一條是ls命令,每到一個子目錄都要先按一下,還有就是cd .. 對吧,經過配置:

bindkey -s '\eo'   'cd ..\n'    # 按下ALT+O 就執行 cd .. 命令
bindkey -s '\e;'   'ls -l\n'    # 按下 ALT+; 就執行 ls -l 命令

你還可以設定一鍵開啟編輯器,或者一鍵幫你輸入某常用命令的一部分。除了這些命令外,日常命令編寫也可以加強一下:

bindkey '\e[1;3D' backward-word       # ALT+左鍵:向後跳一個單詞
bindkey '\e[1;3C' forward-word        # ALT+右鍵:前跳一個單詞
bindkey '\e[1;3A' beginning-of-line   # ALT+上鍵:跳到行首
bindkey '\e[1;3B' end-of-line         # ALT+下鍵:調到行尾

敲命令時經常需要對已有命令進行修改,預設一個字元一個字元的跳太慢了,這樣設定以後基於單詞的跳轉快速很多,配合其他一些快捷鍵,修改命令事半功倍。

還不會在自己的終端軟體裡設定允許ALT鍵的同學們可以搜尋下相關文章。

善用zsh的外掛

介紹幾款熱門常用外掛。

zsh-syntax-highlighting:色彩高亮

zsh-syntax-highlighting的主要作用時讓你在使用zsh的時候,shell命令可以高亮顯示,便捷的知道你輸入的命令是否正確。正確的命令會使用綠色渲染誤的命令會使用紅色警告


安裝

Mac OS:直接brew install zsh-syntax-highlighting,會自動下載這個外掛,再source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh重新整理即可。

對於Oh-my-zsh使用者:

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

然後啟用這個外掛,通過在~/.zshrc中加入外掛的名字:

plugins=([plugins...] zsh-syntax-highlighting)

最後當然是source一下,讓改變生效:source ~/.zshrc

zsh-autosuggestions:命令自動推薦

根據歷史輸入指令的記錄即時的提示,能夠很大的提高效率。

安裝

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

編輯~/.zshrc檔案:plugins=(git zsh-autosuggestions)

z:路徑跳轉魔術師

強大的目錄自動跳轉命令,會記憶你曾經進入過的目錄,用模糊匹配快速進入你想要的目錄。

可以檢視歷史路徑及其權重,跳轉至匹配關鍵字的最高權重路徑:

1. 敲入z命令,會列出自開始用zsh進入過的目錄和它們的權重,進入次數越多,權重越大。

2. 使用z [key]直接跳轉到所有匹配關鍵字的歷史路徑中權重最高的那個。

3. 使用z -l key會列出包含關鍵詞的所有歷史路徑及其權重。關鍵詞可以有多個,使用空格間隔:z -l key1 [key2 ...]。會先匹配第一個,再匹配第二個,直到最後鎖定。

大家實際使用起來,一般是z+最後一級目錄名,99%的時候這樣做就足夠了。當沒有按照你要求跳轉的時候,你可以再補充再上一級目錄的一些資訊。實在弄不明白會跳轉到哪裡,可以隨時用上述123的命令檢視權重。

安裝

直接在~/.zshrc中的外掛那行新增z即可:plugins=(git z)

autojump

zsh和autojump的組合形成了zsh下最強悍的外掛,實現目錄間快速跳轉。想去哪個目錄直接autojump dir_name一部分,不用再頻繁的cd了!

autojump有一個自帶的alias:j,因此簡單輸入j dir就可以轉到對應的目錄去。

對於權重資料庫的訪問

$ autojump -a [dir]
# 在資料庫中新增一個目錄

$ autojump -i [value]
# 提升當前目錄value數目的權重

$ autojump -d [value]
# 降低當前目錄的權重

$ autojump -s
# 顯示資料庫中的統計資料

$ autojump --purge
# 清除不再需要的目錄

安裝

如果你用Mac OS,可以直接brew安裝:brew install autojump。如果是Linux:sudo apt install autojump

修改配置檔案:vim ~/.zshrc,新增:plugins=(git autojump)。另

# 使用brew安裝的
[[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] && . $(brew --prefix)/etc/profile.d/autojump.sh
source $ZSH/oh-my-zsh.sh

# 使用git安裝的
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

zsh-incr:自動補全外掛

安裝

mkdir ~/.oh-my-zsh/plugins/incr
wget http://mimosa-pudica.net/src/incr-0.2.zsh -O ~/.oh-my-zsh/plugins/incr/incr.plugin.zsh

在.zshrc檔案末尾新增:source ~/.oh-my-zsh/plugins/incr/incr*.zsh

之後$ source ~/.zshrc 更新配置即可。

(整理自網路)

參考資料:

https://zhuanlan.zhihu.com/p/19556676

https://www.zhihu.com/question/21418449