Shell程式設計 --- Shell介紹

帥地發表於2018-06-18

排好隊,跟我一起漲知識

什麼是Shell?Shell的中文意思是“外殼”,至於啥是Shell,你確定你真的知道?今天,我們就來談談,什麼是Shell,它是幹嘛的,有哪些優點…

首先說說Shell、核心與硬體的關係

當我們要讓計算機為我們做一件事情的時候,其實真正幫我們把事情給完成好的是硬體這個傢伙。例如,當你要計算 a + b = ?的時候,我們都知道是通過各種電路、晶片等的配合來完成的。硬體這個傢伙雖然幹活強,但是頭腦可能並不是很管用,計算a+b這些指令的時候,它並不知道執行的順序

這個時候核心就出場了,它指揮著硬體如何工作。也就是說,使用者輸入一段命令,核心根據這條命令來指揮硬體如何工作。不過很遺憾,核心這傢伙藏的比較深,使用者是很難與核心直接溝通的。核心管理的東西太多了,擁有的權力太大了,如果使用者叫核心幹嘛,核心就幹嘛的話,萬一使用者一不小心胡亂操作,可能會導致作業系統奔潰的。說這麼多,其實就是想說使用者一般情況下使用者無法與核心直接交流。

這個時候,Shell就出場了,也就是說,使用者輸入命令,Shell對使用者輸入的命令進行解釋,然後提交給核心,核心在指揮硬體正確著工作。

這就是這三個傢伙的關係。如下圖:

其實使用者想要通過計算機來完成某些工作,總不能直接來
作業系統吧?但使用者又必須通過作業系統來完成我們的任務。這個時候使用者一般是通過所謂的應用程式來操作核心,然後讓核心來指揮硬體。我們都知道,應用程式在作業系統中是處於最外層的,就像雞蛋的外殼一樣,因此也就被稱之為Shell

也就是說,Shell的功能只是為使用者作業系統提供一個介面。只要能夠操作應用程式的介面我們都稱之為Shell。俠義的Shell指的是命令列類的軟體。廣義的Shell還儲存那些圖形介面的軟體。

學習Shell有哪些好處呢

有些人可能會覺得現在已經有好多圖形介面的工具可以來操作我們的系統了,為啥還要學習Shell呢?其實Shell的優點多到數不清,我就暫時列舉幾個。

  • 與圖形介面相比,Shell命令列下的執行效率更高,不信你開啟你window下的命令列去刪除一個軟體試試。
  • 學了Shell,裝逼也高格了,當然指的時裝給外行人看,如果有個女同學叫你幫個忙,你用命令列來操作她的電腦,分分鐘成為她的大神。
  • 功能更加強大,有些操作可能在圖形介面不好操作,說個簡單的,例如你想檢視你電腦埠的監聽情況等,用命令列分分鐘的事。
  • 可以遠端操作Linux伺服器,這個可以說用的可多的,通過遠端工具來操作你的伺服器,你總不能要求用介面的來操作吧?

好吧,我就不在列舉了。總之,作為一個程式設計師,學點Shell是必須的。

Shell的種類

雖然一直說是Shell,但是Shell有挺多種的。例如Bourne Shell(sh), Sun裡頭預設的C Shell, 商業上常用的K Shell等。每一個Shell都有各自的特點,語法上也有一些差別。Linux裡使用的這一種版本就稱之為”Bourne Again Shell(簡稱bash)”,這個是Bourne Shell的增強版,算是用的人比較多。還有那個C Shell因為語法與C類似,因此也比較出名,用的人也比較多。 不過我們講的主要以bash為主。

bash有哪些功能?

Linux是使用bash這個shell這個預設的shell的,那它有哪些功能呢?,下面我就列舉它的一些功能

  • 命令記憶能力
    不得不說,命令記憶能力是一個很棒的功能,例如我們可以通過上下按鍵來找到前後一個輸入的命令,這可以讓我們進行更高效的操作。而且我們可以通過歷史命令來進行排錯,當我們系統除問題什麼的時候,我們可以通過檢視我們的歷史命令,看看我們之前都執行了什麼命令,來定位出錯的原因。
    不過這些命令都被存在哪裡呢?其實這個命令就在你的主資料夾內的.bash_history檔案裡,不過需要注意的是,~/.bash_history記錄的是前一次登陸以前所執行過的命令,而這一次登陸所執行的命令都被暫存在記憶體中,當你成功登出系統後,這些命令才會被記錄到.bash_history裡。當然,你也可以強行把這些命令更新的.bash_history裡。

  • 命令與檔案補全功能
    這個功能也是很好用的,可以幫助我們少打些字,也去讓我們輸入的命令更見準確。例如:
    (1).[tab]接在一串命令的第一個字的後面,則為命令補全
    (2).[tab]接在一串命令的第二個字以後時,則為檔案補全
    (3).連續按兩次[tab]可以顯示所有可以執行的命令,要想系統中有多少以c開頭的命令,直接c[tab][tab]。

  • 命令別名的設定(alias)
    給一個命令設定一個別名,可以把指令設定成符號我們習慣的名字,更好的記憶,而且可以把複雜的指令簡單化。

  • 程式指令碼(shell script)
    通過Shell來寫一個指令碼,可以更方便我們執行工作,例如我們可以把進行需要連續用到的命令寫成一個指令碼檔案。

    當然,bash的功能還有很多,以上只是列舉幾個。

    下面我們看看內建命令與外部命令

    在我們執行的命令中,有一些是shell自帶的,我們稱之為內建命令,而有些命令則是程式設計師們為了更方便這工作,加進去的,我們稱之為外部命令。

    顯然,內建命令的執行速度更快。內建命令是當我們登陸系統時,內建命令就被裝入記憶體了,而外部命令則時只有在被呼叫時,才被裝入記憶體。

    例如,當我們輸入一個命令,系統會先判斷該命令是內建命令還是外部命令。如果是內建命令,則直接呼叫執行,否則會根據使用者給出的路徑或者系統環境變數中查詢該命令,找到的話把它裝入記憶體,然後在進行呼叫執行。說白了,外部命令其實就是一個可執行檔案。

我們可以通過type命令來檢視該命令是內建命令還是外部命令。

type [-tpa] name

引數:

不加任何引數時,type會顯示出name是外部命令還是內建命令或是別名
-t: 加了-t後會以如下字眼顯示它的意義:
file:表示為外部命令。
alias:表示該命令為命令別名所設定的名稱
builtin:表示為內建命令
-p: 如果給出的命令是外部命令,則顯示其絕對路徑
-a:在環境變數”PATH”指定的路徑中,顯示給定命令的資訊,包括別名、路徑。

測試用例如下所示:

vi為外部命令,cd為內建命令


今天講到這裡勒。下一篇講Shell中的變數


推薦閱讀:

Linux大人養成計劃1—-基礎命令總結

Linux達人養成計劃2—-虛擬機器下的網路配置

Linux達人養成3—使用遠端工具操作Linux

Linux養成達人4——一些相對有趣點的網路命令

如果你習慣在微信公眾號看技術文章
想要獲取更多資源的同學
歡迎關注我的公眾號:苦逼的碼農
每天向你推送 各種視訊資源,電子書、 技術文章以及
和麵試有關的 演算法專題 每日一題


相關文章