1. 程式人生 > >MAC下終極Shell-ZSH

MAC下終極Shell-ZSH

本文已修改,原文地址:http://zhuanlan.zhihu.com/mactalk/19556676

在開始今天的 MacTalk 之前,先問兩個問題吧:

1、相對於其他系統,Mac 的主要優勢是什麼?
2、你們平時用哪種 Shell?
……

第一個童靴可以坐下了,Mac 的最大優勢是 GUI 和命令列的完美結合,不要把所有注意力放在 Mac 性感的腰身和明媚的顯示屏上好吧,這不是妹紙!第二個童靴你可以出去面壁了,講了這麼多期 MacTalk 你告訴我還在用 Windows 的 cmd, 你讓 Mac 君情何以堪?哪怕你就說在用 Linux 的 Bash 我也就原諒你了,踢飛!

上次在「如何學習一門程式語言」裡提到了 Shell,也有讀者問到 Shell 的問題,所以這次給大家說說 Shell 的事。

我在「趣談個人建站」裡介紹過一點 Shell,自己的東西借用下不丟人,把扯淡的拿掉,乾貨留下,就是如下內容:

Shell是Linux/Unix的一個外殼,你理解成衣服也行。它負責外界與Linux核心的互動,接收使用者或其他應用程式的命令,然後把這些命令轉化成核心能理解的語言,傳給核心,核心是真正幹活的,幹完之後再把結果返回使用者或應用程式。

Linux/Unix提供了很多種Shell,為毛要這麼多Shell?難道用來炒著吃麼?那我問你,你同類型的衣服怎麼有那麼多件?花色,質地還不一樣。寫程式比買衣服複雜多了,而且程式設計師往往負責把複雜的事情搞簡單,簡單的事情搞複雜。牛程式設計師看到不爽的Shell,就會自己重新寫一套,慢慢形成了一些標準,
常用的Shell有這麼幾種,ash、sh、bash、csh等,想知道你的系統有幾種shell,
可以通過以下命令檢視:

cat /etc/shells
顯示如下:

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

在 Linux 裡執行這個命令和 Mac 略有不同,你會發現 Mac 多了一個 zsh,也就是說 OS X 系統預裝了個 zsh,這是個神馬 Shell 呢?

目前常用的 Linux 系統和 OS X 系統的預設 Shell 都是 bash,但是真正強大的 Shell 是深藏不露的 zsh, 這貨絕對是馬車中的跑車,跑車中的飛行車,史稱『終極 Shell』,但是由於以前配置過於複雜,所以初期無人問津,很多人跑過來看看 zsh 的配置指南,什麼都不說轉身就走了。直到有一天,國外有個窮極無聊的程式設計師開發出了一個能夠讓你快速上手的zsh專案,叫做「oh my zsh」,Github 網址是:

https://github.com/robbyrussell/oh-my-zsh
這玩意就像「X天叫你學會 C++」系列,可以讓你神功速成,而且是真的。

好,下面我們看看如何安裝、配置和使用 zsh。

安裝zsh
如果你用 Mac,就可以直接看下一節
如果你用 Redhat Linux,執行:sudo yum install zsh
如果你用 Ubuntu Linux,執行:sudo apt-get install zsh
如果你用 Windows……去洗洗睡吧。

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

安裝oh my zsh
首先安裝 git,安裝方式同上,把 zsh 換成 git 即可。

安裝「oh my zsh」可以自動安裝也可以手動安裝。

自動安裝:


wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

手動安裝:

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 在安裝時已經自動讀取當前的環境變數並進行了設定,你可以繼續追加其他環境變數(按:Android開發者記得在該檔案中配置SDK環境變數,這樣在zsh模式下才能正確執行SDK命令,否則按一般的教程配置的環境變數其實預設都是bash模式下的,會發現到zsh就無效了)。

接下來進行別名的設定,我自己的部分別名配置如下:

alias cls='clear'
alias ll='ls -l'
alias la='ls -a'
alias vi='vim'
alias javac="javac -J-Dfile.encoding=utf8"
alias grep="grep --color=auto"
alias -s html=mate   # 在命令列直接輸入字尾為 html 的檔名,會在 TextMate 中開啟
alias -s rb=mate     # 在命令列直接輸入 ruby 檔案,會在 TextMate 中開啟
alias -s py=vi       # 在命令列直接輸入 python 檔案,會用 vim 中開啟,以下類似
alias -s js=vi
alias -s c=vi
alias -s java=vi
alias -s txt=vi
alias -s gz='tar -xzvf'
alias -s tgz='tar -xzvf'
alias -s zip='unzip'
alias -s bz2='tar -xjvf'

zsh 的牛糞之處在於不僅可以如上設定通用別名,還能針對檔案型別設定對應的開啟程式,比如:

alias -s html=mate,意思就是你在命令列輸入 hello.html,zsh會為你自動開啟 TextMat 並讀取 hello.html; alias -s gz=’tar -xzvf’,表示自動解壓字尾為 gz 的壓縮包。

總之,只有想不到,木有做不到。

設定完環境變數和別名之後,基本上就可以用了,如果你是個主題控,還可以玩玩 zsh 的主題。在 .zshrc 裡找到ZSH_THEME,就可以設定主題了,.zshrc中預設主題是:ZSH_THEME=”robbyrussell”

oh my zsh 提供了數十種主題,相關檔案在~/.oh-my-zsh/themes目錄下,你可以隨意選擇,也可以編輯主題滿足自己的變態需求,我採用了預設主題robbyrussell,不過做了一點小小的改動:

PROMPT=’%{ f g b o l d [ r e d ] (git_prompt_info)%{ f g b o l d [ b l u e ] reset_color%}>’

PROMPT=’%{ f g b o l d [ r e d ] (git_prompt_info)%{ f g b o l d [ b l u e ] reset_color%}’

對照原來的版本,我把 c 改為 d,c 表示當前目錄,d 表示絕對路徑,另外在末尾增加了一個「 > 」,改完之後的效果是這樣的:

大家可以嘗試進行改造,也算個趣事。

最後我們來說說外掛。

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

plugins=(git textmate ruby autojump osx mvn gradle)

下面簡單介紹幾個:

1、git:當你處於一個 git 受控的目錄下時,Shell 會明確顯示 「git」和 branch,如上圖所示,另外對 git 很多命令進行了簡化,例如 gco=’git checkout’、gd=’git diff’、gst=’git status’、g=’git’等等,熟練使用可以大大減少 git 的命令長度,命令內容可以參考~/.oh-my-zsh/plugins/git/git.plugin.zsh

2、textmate:mr可以建立 ruby 的框架專案,tm finename 可以用 textmate 開啟指定檔案。

3、osx:tab 增強,quick-look filename 可以直接預覽檔案,man-preview grep 可以生成 grep手冊 的pdf 版本等。

4、autojump:zsh 和 autojump 的組合形成了 zsh 下最強悍的外掛,今天我們主要說說這貨。

首先安裝autojump,如果你用 Mac,可以使用 brew 安裝:

brew install autojump
如果是 Linux,去下載 autojump 的最新版本,比如:

wget https://github.com/downloads/joelthelion/autojump/autojump_v21.1.2.tar.gz
解壓縮後進入目錄,執行

./install.sh
最後把以下程式碼加入.zshrc:

[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
至此,安裝、配置、外掛三位一體,終極 Shell 全面登場。退出終端會話重新登入,開始感受 zsh 的訓疾如風!

使用 zsh
1、相容 bash,原來使用 bash 的兄弟切換過來毫無壓力,該咋用咋用。

2、強大的歷史紀錄功能,輸入 grep 然後用上下箭頭可以翻閱你執行的所有 grep 命令。

3、智慧拼寫糾正,輸入gtep mactalk * -R,系統會提示:zsh: correct ‘gtep’ to ‘grep’ [nyae]? 比妹紙貼心吧,她們向來都是讓你猜的……

4、各種補全:路徑補全、命令補全,命令引數補全,外掛內容補全等等。觸發補全只需要按一下或兩下 tab 鍵,補全項可以使用 ctrl+n/p/f/b上下左右切換。比如你想殺掉 java 的程序,只需要輸入 kill java + tab鍵,如果只有一個 java 程序,zsh 會自動替換為程序的 pid,如果有多個則會出現選擇項供你選擇。ssh + 空格 + 兩個tab鍵,zsh會列出所有訪問過的主機和使用者名稱進行補全

5、智慧跳轉,安裝了autojump之後,zsh 會自動記錄你訪問過的目錄,通過 j + 目錄名 可以直接進行目錄跳轉,而且目錄名支援模糊匹配和自動補全,例如你訪問過hadoop-1.0.0目錄,輸入j hado 即可正確跳轉。j –stat 可以看你的歷史路徑庫。

6、目錄瀏覽和跳轉:輸入 d,即可列出你在這個會話裡訪問的目錄列表,輸入列表前的序號,即可直接跳轉。

7、在當前目錄下輸入 .. 或 … ,或直接輸入當前目錄名都可以跳轉,你甚至不再需要輸入 cd 命令了。

8、萬用字元搜尋:ls -l */.sh,可以遞迴顯示當前目錄下的 shell 檔案,檔案少時可以代替 find,檔案太多就歇菜了。

9、更強的別名:請參考配置一節。

10、外掛支援:請參考外掛一節。

……

看完這篇文章,你就知道,zsh一出,無人再與爭鋒!終極二字不是蓋的。

如果你是個正在使用 shell程式設計師,如果你依然準備使用 bash,那就去面壁和懺悔吧,別說你訂閱過 MacTalk!

感謝那位開發了 oh my zsh 的無聊程式設計師,他可能沒有因此收穫物質上的利益,但是他的程式碼提升了無數程式設計師的效率,節省了大量的時間,我們說,程式設計師改變世界!

MacTalk 寫的多了,朋友和家人都不太理解,這玩意賺不了錢爭不了名,寫來何用?我想,能夠學習、編碼、寫作,並做出一點幫助別人的東西,總好過炒股炒房的價值吧……