天天看點

終極 Shell

​​

終極 Shell

​​

在開始今天的 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有這麼幾種,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​

​,根據提示輸入目前使用者的密碼就可以了。

安裝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      

都不複雜,安裝完成之後退出目前會話重新打開一個終端視窗,你就可以見到這個彩色的提示了:

​​

終極 Shell

​​

配置

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

​# Customize to your needs…​

可以在此處定義自己的環境變量和别名,當然,oh my 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,就可以設定主題了,預設主題是:

ZSH_THEME=”robbyrussell”

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

PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p%{$fg[cyan]%}%d %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}% %{$reset_color%}>'#PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'      

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

​​

終極 Shell

​​

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

最後我們來說說插件。

插件

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 的最新版本,比如:

git clone git://github.com/joelthelion/autojump.git      

解壓縮後進入目錄,執行

./install.py      

最後把以下代碼加入.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一出,無人再與争鋒!終極二字不是蓋的。