作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
在上一篇文章中,我們已經初嘗了Shell的好處。由於我們后面將大量借助Shell,所以在這里先簡要介紹一下這件工具。
什么是Shell
我們已經說過,Shell是Unix系統提供的文本交互界面。你只需要用鍵盤來輸入命令,就可以和操作系統交互。但這還是不夠具體。說到底,Shell其實是一個運行着的程序。這個程序接收到你按下回車鍵之間的輸入,就會對輸入的文本進行分析。比如下面這個命令:
$free -h
包括空格在內總共7個字符。Shell程序會通過空格,區分出命令的不同部分。第一個部分是命令名。剩下的部分是選項和參數。在這個例子中,Shell會進一步分析第二個部分,發現這一部分的開頭是"-"字符,從而知道它是一個選項。
有了命令名,Shell下一步就要執行該命令名對應的動作。這聽起來就像是在戲劇舞台上,演員按照腳本演戲。Shell命令可以分為如下三類:
- Shell內建函數(built-in function)
- 可執行文件(executable file)
- 別名(alias)
Shell的內建函數是保存在Shell內部的腳本。相對應的,可執行文件是保存在Shell之外的腳本。Shell必須在系統中找到對應命令名的可執行文件,才能正確執行。我們可以用絕對路徑來告訴Shell可執行文件所在的位置。所謂路徑,說明了一個文件在存儲空間的位置:
/bin/date
date這個可執行文件位於根目錄下的bin文件夾。
如果用戶只是給出了命令名,而沒有給出准確的位置,那么Shell必須自行搜索一些特殊的位置,也就是所謂的默認路徑。Shell會執行第一個名字和命令名相同的可執行文件。這就相當於,Shell幫我們自動補齊了可執行文件的位置信息。我們可以通過which命令,來確定命令名對應的是哪個可執行文件:
$which date
別名是給某個命令一個簡稱,以后在Shell中就可以通過這個簡稱來調用對應的命令。在Shell中,我們可以用alias來定義別名:
$alias freak="free -h"
Shell會記住我們的別名定義。以后我在這個Shell中輸入命令freak時,都將等價於輸入free -h。
在Shell中,我們可以通過type命令來了解命令的類型。如果一個命令是可執行文件,那么type將打印出文件的路徑。
$type date
$type pwd
總的來說,Shell就是根據空格和其他特殊符號,來讓電腦理解並執行用戶要求的動作。到了后面,我們還將看到Shell中其他的特殊符號。
Shell的選擇
Shell是文本解釋器程序的統稱,所以包括了不止一種Shell。常見的Shell有sh、bash、ksh、rsh、csh等。在樹莓派中,就安裝了sh和bash兩個Shell解釋器。sh的全名是Bourne Shell。名字中的玻恩就是這個Shell的作者。而bash的全名是Bourne Again Shell。最開始在Unix系統中流行的是sh,而bash作為sh的改進版本,提供了更加豐富的功能。一般來說,都推薦使用bash作為默認的Shell。樹莓派,以及其他Linux系統中廣泛安裝sh,都是出於兼容歷史程序的目的。
我們可以通過下面的命令來查看當前的Shell類型:
$echo $SHELL
echo用於在終端打印出文本。而$是一個新的Shell特殊符號。它提示Shell,后面跟隨的不是一般的文本,而是用於存儲數據的變量。Shell會根據變量名找到真正的文本,替換到變量所在的位置。SHELL變量存儲了當前使用的Shell的信息
你可以在bash中用sh命令啟動sh,並可以用exit命令從中推出。
命令的選項和參數
我們已經看到,一行命令里還可以包含着選項和參數。總的來說,選項用於控制命令的行為,而參數說明了命令的作用對象。比如說:
$uname -m
在上面的命令中,選項-m影響了命令uname的行為,導致uname輸出了樹莓派的CPU型號。如果不是該選項的影響,uname輸出的將是"Linux"。我們不妨把每個命令看做多功能的瑞士軍刀,而選項讓命令在不同的功能間切換。由一個"-"引領一個英文字母,這成為短選項。多個短選項的字母可以合在一起,跟在同一個"-"后面。比如,下面的兩個命令就等價:
$uname -m -r $uname -mr
此外還有一種長選項,是用"--"引領一整個英文單詞,比如:
$date --version
上面的命令將輸出date程序的版本信息。
如果說選項控制了瑞士軍刀的行為,那么參數就提供了瑞士軍刀發揮用場的原材料。就拿echo這個命令來說,它能把字符打印到終端。它選擇打印的對象,正是它的參數:
$echo hello
有的時候,選項也會攜帶變量,以便來說明選項行為的原材料。比如:
$sudo date --set="1999-01-01 08:00:00"
選項"--set"用於設置時間,用等號連接的,就是它的參數。date會把日期設置成這一變量所代表的日期。如果用短選項,那么就要用空格取代等號了:
$sudo date -s "1999-01-01 08:00:00"
值得注意的是,Shell對空格敏感。當一整個參數信息中包含了空格時,我們需要用引號把參數包裹起來,以便Shell能識別出這是一個整體。
需要注意,所謂的選項和參數提供給命令的附加信息。因此,命令最終會拿這些字符串做什么,是由命令自己決定的。因此,有時會發現一些特異的選項或參數用法。這個時候,你就要從文檔中尋找答案。
如何了解一個陌生的命令?
每一個Linux系統都帶有一套完善的文檔,向你解釋每個命令的用途。你可以用下面三個命令來調用某個命令的文檔信息:
$whatis ls
whatis用很簡短的一句話來介紹命令。
$man ls
man會返回命令的幫助手冊。對於大部分的Linux自帶的命令來說,當作者編寫它的時候,都會帶有一個幫助文檔,告訴用戶怎么使用這個命令。man可以說是我們了解Linux最好的百科全書,它不但可以告訴你Linux自帶的命令的功能,還可以查詢Linux的系統文件和系統調用。如果想要深入學習Linux,就必須要懂得如何用man來查詢相關文檔。
$info ls
info將返回更詳細的幫助信息
Shell的小竅門
1)命令補齊
大多數的Shell都有命令補齊的功能。當你在$的后面輸入命令的一部分時,比如"dat"的時候,按Tab鍵,Linux會幫你打剩下的字符,補充成為"date"。這個過程中,Shell會搜索該命令名的所有可能。如果只有一種可能,那么Shell就會把該文件名補齊。如果不止一種,按第一次Tab會沒有反應,按第二次Tab時,終端會打印出所有可能的命令名。比如輸入"da",按兩次Tab后,終端輸出:
dash date
2)文件名補齊
不止是命令名,如果你輸入的是作為參數的文件名,Linux也可以幫你補齊。比如說, 當前目錄下有a.txt文件。當你輸入到ls a.t的時候,按Tab鍵,Shell會幫你補齊該文件名,成為ls a.txt。
3)歷史命令
在Shell中,你還可以用向上箭頭來查看之前輸入運行的命令。你也可以用
$history
來查詢之前輸入的命令。
4)中止與暫停命令
當一個命令運行時,你中途想要停止它時,可以用Ctrl + c。如果你只是想暫時停止,使用Ctrl + z。具體機制與信號(signal)有關,我們將在以后介紹
這一章中對Shell的介紹大多是圍繞着命令進行。事實上,Shell還能一定程度的編程,從而組合功能單一的命令,完成更復雜的任務。我將在未來進一步探索Shell的這個方面。
總結
命令行: 使用Shell解釋輸入的字符串,以運行程序
type
echo, ls
sudo
which, whatis, man, info
使用Tab自動補齊,向上箭頭查詢歷史,history
Ctrl + c, Ctrl + z
歡迎閱讀“騎着企鵝采樹莓”系列文章