關於shell,一個廣義的解釋就是在使用者與作業系統之間,提供一個工具或介面給使用者來操作計算機系統;使用者在shell中通過輸入命令列,按下Enter鍵,shell執行命令後就能返回結果,達到操作計算機的效果。
但有很多人會問,為什麼要學習shell呢?以下是我對為什麼要學習shell的看法:
- 在通過ssh來遠端操縱Linux/Unix伺服器時,都是使用shell而不是使用者介面
- 相比於通過點選多個使用者介面來執行操作,輸入命令列更加直接和快捷
- 利用管道組合各種可用工具,來建立和定製巨集工具
- 使用shell script將重複簡單的任務自動化
而shell有很多種:Bourne Shell, C Shell,Korn Shell,Bourne-again Shell,TENEX C Shell等,通過命令cat /etc/shells可以檢視系統支援哪些shell:
System Support Shell.png
Linux/Unix預設都是使用Bash(Bourne-again Shell),但我更傾向於使用zsh,但由於配置過於複雜,前期很少人使用,但後來有外國程式設計師弄出一個Oh My ZSH來管理zsh的配置和支援更多外掛,使得zsh變得更容易使用和更加強大。
zsh shell.png
Shell有哪些功能
-
命令歷史記錄
一旦你在shell敲入正確命令並能執行後,shell就會儲存你所敲入命令的歷史記錄(存放在~/.bash_history檔案),方便你再次執行之前的命令。
你可以按方向鍵↑和↓來檢視之前執行過的命令
Shell Command History.gif
可以用!!來執行上一條命令,但最常用還是使用ctrl-r來搜尋命令歷史記錄
Shell Search Command History.gif
-
命令和檔案補全(按tab鍵)
當你輸入命令或檔名時,你可以通過按tab鍵來補全命令或檔名,這樣可以讓你更快敲入命令和敲入正確的命令。
有時你忘記具體某個命令,但你記住命令開頭的幾個字母是gi,可以敲入字母gi,按tab鍵來顯示與前幾個字母有關的所有命令:
Shell Command Complete.gif當用cd命令前往某個目錄時,你不必敲入整個路徑的所有目錄名,你只需敲入目錄前幾個字母,然後按tab鍵逐個補全目錄名即可。
Shell Auto Complete Dir.gif -
命令別名
命令別名是一個比較有用的東西,特別適應用於簡化命令輸入。比如,你要更新cocoapods時,在shell輸入以下命令列
1pod update --verbose --no-repo-update但每次都輸入這麼長的命令列,多麼麻煩啊。所以,這時使用命令別名來簡化命令列的輸入:
1alias pod_update='pod update --verbose --no-repo-update'下次你只需要輸入pod_update就可以更新cocoapod
你可以使用alias命令來顯示所有命令別名
list all alias .png -
任務控制(job control)
使用shell登陸系統後,想要一邊複製檔案、一邊查詢檔案、一邊進行編譯程式碼、一邊下載軟體,當然可以通過開啟多個shell來完成,但如果想只在一個shell來完成以上多個任務時,此時可以使用shell的一個特性任務控制。
在學會如何使用命令來控制任務之前,先了解兩個概念:前臺(foreground)和後臺(background)。前臺就是出現提示符讓使用者操作的環境,而後臺就是不能與使用者互動的環境,你無法使用 ctrl-c 終止它,可使用 bg/fg 呼叫該任務。
下面介紹一些命令如何控制任務:
1. 將任務放在後臺執行:command + &
job control 1.png注意一下上面列印資訊,[1]表示job number(任務編號),7089表示PID(程式號)。在後臺執行的命令,如果有stdout和stderr,資料依舊輸出到螢幕上,可以通過資料重定向傳輸到檔案中,就不會影響前臺的工作。
job control 2.png2. 將任務丟到後臺暫停:ctrl-z
在shell中執行find / -print命令,然後按下ctrl-z將任務丟到後臺暫停:
job control 3.png由上面列印可知,任務find / -print暫停執行,並將任務放在後臺,返回一個job number[2]
3. 檢視後臺所有任務狀態:jobs -l
輸入jobs -l 檢視後臺所有的任務狀態:
job control 4.png仔細檢視列印資訊,有沒有留意到在PID 7417和7431之前有-和+兩個符號,-表示最近第二個被放到後臺的任務號碼,+表示最近被放到後臺的任務號碼。
4. 將後臺的任務拿到前臺處理:fg %jobnumber
輸入fg會預設取出+的任務,然後迅速按下ctrl-z
job control 5.png看上面列印的PID是7431,確實如此。再次輸入jobs -l來檢視後臺所有任務的資訊
job control 6.png這次輸入fg %1來講後臺的任務拿到前臺處理。
5. 將後臺的任務變成執行中:bg %jobnumber
輸入jobs -l檢視任務狀態:
job control 7.png然後輸入bg %2; jobs -l將後臺任務變成執行,並檢視任務狀態,然後不斷地輸入列印資訊,這時需要關閉終端才能kill這個shell程式的子程式。
6. 管理後臺當中的任務:kill -signal %jobnumber
有時,任務在後臺執行或暫停,這時我想結束這個任務,怎樣辦呢?你可以使用kill命令將任務結束。
輸入find / -print命令,並按下ctrl-z暫停任務:
job control 8.png輸入kill -9 %1;jobs -l結束任務並顯示任務狀態:
job control 9.png -
shell script
shell script是利用shell的功能所編寫的一個程式,這個程式使用純文字檔案來儲存一些shell的命令,並遵循shell的語法規則,搭配資料重定向、管道、和正規表示式等功能來組合各種工具,實現簡單重複任務的自動化。
-
萬用字元
除了完整的字串之外,shell還支援許多的萬用字元來幫助使用者查詢和命令執行。我簡答地列出常用的幾個萬用字元:
符號 | 含義 |
---|---|
* | 表示0到無窮多個任意字元 |
? | 表示有一個任意字元 |
[] | 表示有一個在中括號內的字元。例如[abc]表示有個字元,可能是abc其中一個 |
[-] | 表示在編碼順序內的所有字元。例如[1-7]表示有個字元,範圍1到7其中一個 |
[^] | 表示反向選擇。例如表示有一個字元,只要不是a,b,c的其他字元都可以 |
iTerm 2(for mac) && Oh My Zsh
如果你是mac的使用者,推薦一個終端應用iTerm 2, iTerm 2 相比mac自帶的 Terminal 應用,有太多優點了。例如,支援畫面分割,可以設定主題,各種使用的快捷鍵,以及快速喚出。配合 Oh My Zsh 使用,簡直優雅到爆!
Oh My Zsh安裝
-
curl方式
1curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh -
wget方式
1wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh安裝完之後,關閉當前終端,並重新開啟一個,oh my zsh的預設主題是robbyrussell,效果如下:
robbyrussell theme.jpg
配置
如果你想定製和擴充套件zsh,oh my zsh提供配置檔案~/.zshrc來配置,可以設定環境變數和別名;
1 2 3 4 5 6 7 8 9 10 11 |
# Support autojump [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh # setup moco alias name alias moco_service="moco start -p 12306 -g settings.json" #setup macvim alias name alias vim="/Applications/MacVim.app/Contents/MacOS/Vim" #setup pod update alias name alias pod_update='pod update --verbose --no-repo-update' |
在Themes列出所有可用主題,每個主題都有截圖效果並教你如何設定,選擇你喜歡的主題,在配置檔案~/.zshrc查詢字串ZSH_THEME=”robbyrussell”,通過改變ZSH_THEME環境變數來改變主題。例如,
1 |
ZSH_THEME="agnoster" |
oh my zsh提供數十種主題,相關檔案在~/.oh-my-zsh/themes 目錄,可以編輯主題來滿足自身需求,我是使用預設的robbyrussell,不過做了一點小小改動:
1 2 |
PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p%{$fg[cyan]%}%d %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}% %{$reset_color%}> ' #PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}> ' |
與原來不同的是,將c(表示當前目錄)改為d(表示絕對路徑),另外在尾部新增一個>作為隔離符號,效果如下:
modified robbyrussell.png
外掛
oh my zsh提供豐富的外掛,存放在~/.oh-my-zsh/plugins目錄下:
oh my zsh plugins.png
想了解每個外掛的功能以及如何使用,只要開啟相關外掛的目錄下zsh檔案即可,以git外掛為例:
git plugin.png
開啟git.plugin.zsh檔案,裡面有很多命名別來來簡化命令的輸入。你可以根據自己的需要來啟用哪些外掛,只需在~/.zshrc配置檔案追加內容即可:
1 |
plugins=(git autojump osx) |
我來介紹一下一些常用外掛的使用吧:
git
當你處在一個git受控的目錄下時,Shell明確顯示git和branch資訊,另外簡化git很多命令,具體使用請參考:Plugin:git
autojump
autojump外掛使你能夠快速切換路徑,再也不需要逐個敲入目錄,只需敲入目標目錄,就可以迅速切換目錄。
- 安裝
如果你是mac使用者,可以使用brew安裝:
1brew install autojump
如果是linux使用者,首先下載autojump最近版本,比如:
1git clone git://github.com/joelthelion/autojump.git
然後進入目錄,執行
1./install.py
最近將以下程式碼加入~/.zshrc配置檔案:
1[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh - 使用
如果你之前開啟過~/.oh-my-zsh/themes目錄,現在只需敲入j themes就可以快速切換到~/.oh-my-zsh/themes目錄。
autojump.png
osx
- tab – 在一個新標籤開啟當前目錄
- cdf – cd到當前Finder目錄
- quick-look – 快速瀏覽特殊的檔案
- man-preview – 在Preview應用開啟特定的man page
- trash – 將特定的檔案移到垃圾桶
使用
- 因為zsh相容bash,所以之前使用bash的人切換到zsh毫無壓力
- 智慧拼寫糾正,比如你輸入cls,會提示
auto correct.png - 各種補全:除了支援命令補全和檔案補全之外,還支援命令引數補全,外掛內容補全,只需要按tab鍵
- 使用autojump智慧跳轉
- 目錄瀏覽和跳轉:輸入d,就顯示在會話裡訪問的目錄列表,輸入列表前的序號,即可以跳轉
list dir and jump.png - 輸入..可以返回到上級目錄
parent dir.pngYouTube有個演示視訊 zsh shell詳細介紹如果使用Oh My Zsh
總結
作為的一個程式設計師,我覺得shell是一個必不可少的工具,使用它能夠毫不費勁地操作計算機。在shell提示下,通過呼叫各種各樣的工具,並結合管道,將這些工具根據自己需要組合起來,建立和制定巨集工具,甚至編寫shell script來將簡單而重複的工作自動化,做到Don’t repeat your self。
擴充套件閱讀
- Linux Shell
工作管理 (job control) - oh my shell
終極 Shell