在快速了解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