關于shell噩咪,一個廣義的解釋就是在用戶與操作系統(tǒng)之間,提供一個工具或接口給用戶來操作計算機系統(tǒng)极阅;用戶在shell中通過輸入命令行胃碾,按下回車鍵,shell執(zhí)行命令后就能返回結(jié)果筋搏,達到操作計算機的效果书在。
但有很多人會問,為什么要學習shell呢拆又?以下是我對為什么要學習shell的看法:
- 在通過ssh來遠程操縱Linux/Unix服務器時儒旬,都是使用shell而不是用戶界面
- 相比于通過點擊多個用戶界面來執(zhí)行操作,輸入命令行更加直接和快捷
- 利用管道組合各種可用工具帖族,來創(chuàng)建和定制宏工具
- 使用shell script將重復簡單的任務自動化
而shell有很多種:Bourne Shell栈源, C Shell,Korn Shell竖般,Bourne-again Shell甚垦,TENEX C Shell等,通過命令cat /etc/shells
可以查看系統(tǒng)支持哪些shell:
Linux/Unix默認都是使用Bash(Bourne-again Shell)涣雕,但我更傾向于使用zsh艰亮,但由于配置過于復雜,前期很少人使用挣郭,但后來有外國程序員弄出一個Oh My ZSH來管理zsh的配置和支持更多插件迄埃,使得zsh變得更容易使用和更加強大。
Shell有哪些功能
-
命令歷史記錄
一旦你在shell敲入正確命令并能執(zhí)行后兑障,shell就會存儲你所敲入命令的歷史記錄(存放在~/.bash_history
文件)侄非,方便你再次運行之前的命令。
你可以按方向鍵↑
和↓
來查看之前執(zhí)行過的命令
可以用
!!
來執(zhí)行上一條命令流译,但最常用還是使用ctrl-r
來搜索命令歷史記錄
-
命令和文件補全(按
tab
鍵)
當你輸入命令或文件名時逞怨,你可以通過按tab
鍵來補全命令或文件名,這樣可以讓你更快敲入命令和敲入正確的命令福澡。
有時你忘記具體某個命令叠赦,但你記住命令開頭的幾個字母是gi
,可以敲入字母gi
革砸,按tab
鍵來顯示與前幾個字母有關的所有命令:
當用
cd
命令前往某個目錄時除秀,你不必敲入整個路徑的所有目錄名窥翩,你只需敲入目錄前幾個字母,然后按tab
鍵逐個補全目錄名即可鳞仙。-
命令別名
命令別名是一個比較有用的東西寇蚊,特別適應用于簡化命令輸入。比如棍好,你要更新cocoapods時仗岸,在shell輸入以下命令行
pod update --verbose --no-repo-update
但每次都輸入這么長的命令行,多么麻煩啊借笙。所以扒怖,這時使用命令別名來簡化命令行的輸入:
alias pod_update='pod update --verbose --no-repo-update'
下次你只需要輸入pod_update
就可以更新cocoapod
你可以使用alias
命令來顯示所有命令別名
-
任務控制(job control)
使用shell登陸系統(tǒng)后,想要一邊復制文件业稼、一邊查找文件盗痒、一邊進行編譯代碼、一邊下載軟件低散,當然可以通過開啟多個shell來完成俯邓,但如果想只在一個shell來完成以上多個任務時,此時可以使用shell的一個特性任務控制熔号。
在學會如何使用命令來控制任務之前稽鞭,先了解兩個概念:前臺(foreground)和后臺(background)。前臺就是出現(xiàn)提示符讓用戶操作的環(huán)境引镊,而后臺就是不能與用戶交互的環(huán)境朦蕴,你無法使用 ctrl-c
終止它,可使用 bg/fg
呼叫該任務弟头。
下面介紹一些命令如何控制任務:
1. 將任務放在后臺運行:命令行 + &
注意一下上面打印信息吩抓,[1]
表示job number(任務編號),7089
表示PID(進程號)赴恨。在后臺執(zhí)行的命令疹娶,如果有stdout和stderr,數(shù)據(jù)依舊輸出到屏幕上嘱支,可以通過數(shù)據(jù)重定向傳輸?shù)轿募序拘兀筒粫绊懬芭_的工作。
2. 將任務丟到后臺暫停:ctrl-z
在shell中執(zhí)行find / -print
命令除师,然后按下ctrl-z
將任務丟到后臺暫停:
由上面打印可知,任務
find / -print
暫停執(zhí)行扔枫,并將任務放在后臺汛聚,返回一個job number[2]
3. 查看后臺所有任務狀態(tài):jobs -l
輸入jobs -l
查看后臺所有的任務狀態(tài):
仔細查看打印信息,有沒有留意到在PID
7417
和7431
之前有-
和+
兩個符號短荐,-
表示最近第二個被放到后臺的任務號碼倚舀,+
表示最近被放到后臺的任務號碼叹哭。
4. 將后臺的任務拿到前臺處理:fg %jobnumber
輸入fg
會默認取出+
的任務,然后迅速按下ctrl-z
看上面打印的PID是
7431
痕貌,確實如此风罩。再次輸入jobs -l
來查看后臺所有任務的信息這次輸入
fg %1
來講后臺的任務拿到前臺處理。
5. 將后臺的任務變成運行中:bg %jobnumber
輸入jobs -l
查看任務狀態(tài):
然后輸入
bg %2; jobs -l
將后臺任務變成運行舵稠,并查看任務狀態(tài)超升,然后不斷地輸入打印信息,這時需要關閉終端才能kill這個shell進程的子進程哺徊。
6. 管理后臺當中的任務:kill -signal %jobnumber
有時室琢,任務在后臺運行或暫停,這時我想結(jié)束這個任務落追,怎樣辦呢盈滴?你可以使用kill
命令將任務結(jié)束。
輸入find / -print
命令轿钠,并按下ctrl-z
暫停任務:
輸入
kill -9 %1;jobs -l
結(jié)束任務并顯示任務狀態(tài):-
shell script
shell script是利用shell的功能所編寫的一個程序巢钓,這個程序使用純文本文件來保存一些shell的命令,并遵循shell的語法規(guī)則疗垛,搭配數(shù)據(jù)重定向竿报、管道、和正則表達式等功能來組合各種工具继谚,實現(xiàn)簡單重復任務的自動化烈菌。
-
通配符
除了完整的字符串之外,shell還支持許多的通配符來幫助用戶查詢和命令執(zhí)行花履。我簡答地列出常用的幾個通配符:
符號 | 含義 |
---|---|
* | 表示0到無窮多個任意字符 |
? | 表示有一個任意字符 |
[] | 表示有一個在中括號內(nèi)的字符芽世。例如[abc]表示有個字符,可能是abc其中一個 |
[-] | 表示在編碼順序內(nèi)的所有字符诡壁。例如[1-7]表示有個字符济瓢,范圍1到7其中一個 |
[^] | 表示反向選擇。例如表示有一個字符妹卿,只要不是a,b,c的其他字符都可以 |
iTerm 2(for mac) && Oh My Zsh
如果你是mac的用戶旺矾,推薦一個終端應用iTerm 2, iTerm 2 相比mac自帶的 Terminal 應用,有太多優(yōu)點了夺克。例如箕宙,支持畫面分割,可以設置主題铺纽,各種使用的快捷鍵柬帕,以及快速喚出。配合 Oh My Zsh 使用,簡直優(yōu)雅到爆陷寝!
Oh My Zsh安裝
-
curl方式
curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
-
wget方式
wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh
安裝完之后锅很,關閉當前終端,并重新打開一個凤跑,oh my zsh的默認主題是robbyrussell
爆安,效果如下:
配置
如果你想定制和擴展zsh,oh my zsh提供配置文件~/.zshrc
來配置仔引,可以設置環(huán)境變量和別名扔仓;
# 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
環(huán)境變量來改變主題鲤看。例如缘揪,
ZSH_THEME="agnoster"
oh my zsh提供數(shù)十種主題,相關文件在~/.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='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}> '
與原來不同的是慷吊,將c(表示當前目錄)改為d(表示絕對路徑)袖裕,另外在尾部添加一個>
作為隔離符號,效果如下:
插件
oh my zsh提供豐富的插件溉瓶,存放在~/.oh-my-zsh/plugins
目錄下:
打開
git.plugin.zsh
文件堰酿,里面有很多命名別來來簡化命令的輸入疾宏。你可以根據(jù)自己的需要來啟用哪些插件,只需在~/.zshrc
配置文件追加內(nèi)容即可:
plugins=(git autojump osx)
我來介紹一下一些常用插件的使用吧:
git
當你處在一個git受控的目錄下時触创,Shell明確顯示git
和branch
信息坎藐,另外簡化git很多命令,具體使用請參考:Plugin:git
autojump
autojump插件使你能夠快速切換路徑哼绑,再也不需要逐個敲入目錄岩馍,只需敲入目標目錄,就可以迅速切換目錄抖韩。
- 安裝
如果你是mac用戶蛀恩,可以使用brew
安裝:
brew install autojump
如果是linux用戶,首先下載autojump最近版本帽蝶,比如:
git clone git://github.com/joelthelion/autojump.git
然后進入目錄赦肋,執(zhí)行
./install.py
最近將以下代碼加入~/.zshrc
配置文件:
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
- 使用
如果你之前打開過~/.oh-my-zsh/themes
目錄块攒,現(xiàn)在只需敲入j themes
就可以快速切換到~/.oh-my-zsh/themes
目錄励稳。
osx
-
tab
- 在一個新標簽打開當前目錄 -
cdf
- cd到當前Finder目錄 -
quick-look
- 快速瀏覽特殊的文件 -
man-preview
- 在Preview應用打開特定的man page -
trash
- 將特定的文件移到垃圾桶
使用
- 因為zsh兼容bash佃乘,所以之前使用bash的人切換到zsh毫無壓力
- 智能拼寫糾正,比如你輸入
cls
驹尼,會提示
- 各種補全:除了支持命令補全和文件補全之外趣避,還支持命令參數(shù)補全,插件內(nèi)容補全新翎,只需要按
tab
鍵 - 使用
autojump
智能跳轉(zhuǎn) - 目錄瀏覽和跳轉(zhuǎn):輸入d程帕,就顯示在會話里訪問的目錄列表,輸入列表前的序號地啰,即可以跳轉(zhuǎn)
- 輸入
..
可以返回到上級目錄
YouTube有個演示視頻 zsh shell詳細介紹如果使用Oh My Zsh
總結(jié)
作為的一個程序員愁拭,我覺得shell是一個必不可少的工具,使用它能夠毫不費勁地操作計算機亏吝。在shell提示下岭埠,通過調(diào)用各種各樣的工具,并結(jié)合管道蔚鸥,將這些工具根據(jù)自己需要組合起來惜论,創(chuàng)建和制定宏工具,甚至編寫shell script來將簡單而重復的工作自動化止喷,做到Don't repeat your self馆类。
擴展閱讀
- Linux Shell
工作管理 (job control) - oh my shell
終極 Shell