Shell是怎么連接用戶和內(nèi)核的

這篇文章主要介紹了Shell是怎么連接用戶和內(nèi)核的,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供秀洲企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、HTML5、小程序制作等業(yè)務(wù)。10年已為秀洲眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

現(xiàn)在我們使用的操作系統(tǒng)(Windows、Mac OS、Android、iOS 等)都是帶圖形界面的,簡(jiǎn)單直觀,容易上手,對(duì)專業(yè)用戶(程序員、網(wǎng)管等)和普通用戶(家庭主婦、老年人等)都非常適用;計(jì)算機(jī)的普及離不開圖形界面。

然而在計(jì)算機(jī)的早期并沒有圖形界面,我們只能通過(guò)一個(gè)一個(gè)地命令來(lái)控制計(jì)算機(jī),這些命令有成百上千之多,且不說(shuō)記住這些命令非常困難,每天面對(duì)沒有任何色彩的“黑屏”本身就是一件枯燥的事情;這個(gè)時(shí)候的計(jì)算機(jī)還遠(yuǎn)遠(yuǎn)談不上炫酷和普及,只有專業(yè)人員才能使用。

對(duì)于圖形界面,用戶點(diǎn)擊某個(gè)圖標(biāo)就能啟動(dòng)某個(gè)程序;對(duì)于命令行,用戶輸入某個(gè)程序的名字(可以看做一個(gè)命令)就能啟動(dòng)某個(gè)程序。這兩者的基本過(guò)程都是類似的,都需要查找程序在硬盤上的安裝位置,然后將它們加載到內(nèi)存運(yùn)行。

換句話說(shuō),圖形界面和命令行要達(dá)到的目的是一樣的,都是讓用戶控制計(jì)算機(jī)。

然而,真正能夠控制計(jì)算機(jī)硬件(CPU、內(nèi)存、顯示器等)的只有操作系統(tǒng)內(nèi)核(Kernel),圖形界面和命令行只是架設(shè)在用戶和內(nèi)核之間的一座橋梁。

由于安全、復(fù)雜、繁瑣等原因,用戶不能直接接觸內(nèi)核(也沒有必要),需要另外再開發(fā)一個(gè)程序,讓用戶直接使用這個(gè)程序;該程序的作用就是接收用戶的操作(點(diǎn)擊圖標(biāo)、輸入命令),并進(jìn)行簡(jiǎn)單的處理,然后再傳遞給內(nèi)核,這樣用戶就能間接地使用操作系統(tǒng)內(nèi)核了。你看,在用戶和內(nèi)核之間增加一層“代理”,既能簡(jiǎn)化用戶的操作,又能保障內(nèi)核的安全,何樂不為呢?

用戶界面和命令行就是這個(gè)另外開發(fā)的程序,就是這層“代理”。在Linux下,這個(gè)命令行程序叫做 Shell。

Shell 是一個(gè)應(yīng)用程序,它連接了用戶和 Linux 內(nèi)核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內(nèi)核,這就是 Shell 的本質(zhì)。

Shell 本身并不是內(nèi)核的一部分,它只是站在內(nèi)核的基礎(chǔ)上編寫的一個(gè)應(yīng)用程序,它和 QQ、迅雷、Firefox 等其它軟件沒有什么區(qū)別。然而 Shell 也有著它的特殊性,就是開機(jī)立馬啟動(dòng),并呈現(xiàn)在用戶面前;用戶通過(guò) Shell 來(lái)使用 Linux,不啟動(dòng) Shell 的話,用戶就沒辦法使用 Linux。

Shell 是如何連接用戶和內(nèi)核的?

Shell 能夠接收用戶輸入的命令,并對(duì)命令進(jìn)行處理,處理完畢后再將結(jié)果反饋給用戶,比如輸出到顯示器、寫入到文件等,這就是大部分讀者對(duì) Shell 的認(rèn)知。你看,我一直都在使用 Shell,哪有使用內(nèi)核哦?我也沒有看到 Shell 將我和內(nèi)核連接起來(lái)呀?!

其實(shí),Shell 程序本身的功能是很弱的,比如文件操作、輸入輸出、進(jìn)程管理等都得依賴內(nèi)核。我們運(yùn)行一個(gè)命令,大部分情況下 Shell 都會(huì)去調(diào)用內(nèi)核暴露出來(lái)的接口,這就是在使用內(nèi)核,只是這個(gè)過(guò)程被 Shell 隱藏了起來(lái),它自己在背后默默進(jìn)行,我們看不到而已。

接口其實(shí)就是一個(gè)一個(gè)的函數(shù),使用內(nèi)核就是調(diào)用這些函數(shù)。這就是使用內(nèi)核的全部?jī)?nèi)容了嗎?嗯,是的!除了函數(shù),你沒有別的途徑使用內(nèi)核。

比如,我們都知道在 Shell 中輸入cat log.txt命令就可以查看 log.txt 文件中的內(nèi)容,然而,log.txt 放在磁盤的哪個(gè)位置?分成了幾個(gè)數(shù)據(jù)塊?在哪里開始?在哪里終止?如何操作探頭讀取它?這些底層細(xì)節(jié) Shell 統(tǒng)統(tǒng)不知道的,它只能去調(diào)用內(nèi)核提供的 open() 和 read() 函數(shù),告訴內(nèi)核我要讀取 log.txt 文件,請(qǐng)幫助我,然后內(nèi)核就乖乖地按照 Shell 的吩咐去讀取文件了,并將讀取到的文件內(nèi)容交給 Shell,最后再由 Shell 呈現(xiàn)給用戶(其實(shí)呈現(xiàn)到顯示器上還得依賴內(nèi)核)。整個(gè)過(guò)程中 Shell 就是一個(gè)“中間商”,它在用戶和內(nèi)核之間“倒賣”數(shù)據(jù),只是用戶不知道罷了。

Shell 還能連接其它程序

在 Shell 中輸入的命令,有一部分是 Shell 本身自帶的,這叫做內(nèi)置命令;有一部分是其它的應(yīng)用程序(一個(gè)程序就是一個(gè)命令),這叫做外部命令。

Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以調(diào)用其他的程序,每個(gè)程序就是一個(gè)命令,這使得 Shell 命令的數(shù)量可以無(wú)限擴(kuò)展,其結(jié)果就是 Shell 的功能非常強(qiáng)大,完全能夠勝任 Linux 的日常管理工作,如文本或字符串檢索、文件的查找或創(chuàng)建、大規(guī)模軟件的自動(dòng)部署、更改系統(tǒng)設(shè)置、監(jiān)控服務(wù)器性能、發(fā)送報(bào)警郵件、抓取網(wǎng)頁(yè)內(nèi)容、壓縮文件等。

更加驚訝的是,Shell 還可以讓多個(gè)外部程序發(fā)生連接,在它們之間很方便地傳遞數(shù)據(jù),也就是把一個(gè)程序的輸出結(jié)果傳遞給另一個(gè)程序作為輸入。

大家所說(shuō)的 Shell 強(qiáng)大,并不是 Shell 本身功能豐富,而是它擅長(zhǎng)使用和組織其他的程序。Shell 就是一個(gè)領(lǐng)導(dǎo)者,這正是 Shell 的魅力所在。

可以將 Shell 在整個(gè) Linux 系統(tǒng)中的地位描述成下圖所示的樣子。注意“用戶”和“其它應(yīng)用程序”是通過(guò)虛線連接的,因?yàn)橛脩魡?dòng) Linux 后直接面對(duì)的是 Shell,通過(guò) Shell 才能運(yùn)行其它的應(yīng)用程序。

Shell 也支持編程

Shell 并不是簡(jiǎn)單的堆砌命令,我們還可以在 Shell 中編程,這和使用 C++、C#、Java、Python 等常見的編程語(yǔ)言并沒有什么兩樣。

Shell 雖然沒有 C++、Java、Python 等強(qiáng)大,但也支持了基本的編程元素,例如:

if...else 選擇結(jié)構(gòu),case...in 開關(guān)語(yǔ)句,for、while、until 循環(huán);

變量、數(shù)組、字符串、注釋、加減乘除、邏輯運(yùn)算等概念;

函數(shù),包括用戶自定義的函數(shù)和內(nèi)置函數(shù)(例如 printf、export、eval 等)。

站在這個(gè)角度講,Shell 也是一種編程語(yǔ)言,它的編譯器(解釋器)是 Shell 這個(gè)程序。我們平時(shí)所說(shuō)的 Shell,有時(shí)候是指連接用戶和內(nèi)核的這個(gè)程序,有時(shí)候又是指 Shell 編程。

Shell 主要用來(lái)開發(fā)一些實(shí)用的、自動(dòng)化的小工具,而不是用來(lái)開發(fā)具有復(fù)雜業(yè)務(wù)邏輯的中大型軟件,例如檢測(cè)計(jì)算機(jī)的硬件參數(shù)、搭建 Web 運(yùn)行環(huán)境、日志分析等,Shell 都非常合適。

使用 Shell 的熟練程度反映了用戶對(duì) Linux 的掌握程度,運(yùn)維工程師、網(wǎng)絡(luò)管理員、程序員都應(yīng)該學(xué)習(xí) Shell。

尤其是 Linux 運(yùn)維工程師,Shell 更是必不可少的,是必須掌握的技能,它使得我們能夠自動(dòng)化地管理服務(wù)器集群,否則你就得一個(gè)一個(gè)地登錄所有的服務(wù)器,對(duì)每一臺(tái)服務(wù)器都進(jìn)行相同的設(shè)置,而這些服務(wù)器可能有成百上千之多,會(huì)浪費(fèi)大量的時(shí)間在重復(fù)性的工作上。

Shell 是一種腳本語(yǔ)言

任何代碼最終都要被“翻譯”成二進(jìn)制的形式才能在計(jì)算機(jī)中執(zhí)行。

有的編程語(yǔ)言,如 C/C++、Pascal、Go語(yǔ)言、匯編等,必須在程序運(yùn)行之前將所有代碼都翻譯成二進(jìn)制形式,也就是生成可執(zhí)行文件,用戶拿到的是最終生成的可執(zhí)行文件,看不到源碼。

這個(gè)過(guò)程叫做編譯(Compile),這樣的編程語(yǔ)言叫做編譯型語(yǔ)言,完成編譯過(guò)程的軟件叫做編譯器(Compiler)。

而有的編程語(yǔ)言,如 Shell、JavaScript、Python、PHP等,需要一邊執(zhí)行一邊翻譯,不會(huì)生成任何可執(zhí)行文件,用戶必須拿到源碼才能運(yùn)行程序。程序運(yùn)行后會(huì)即時(shí)翻譯,翻譯完一部分執(zhí)行一部分,不用等到所有代碼都翻譯完。

這個(gè)過(guò)程叫做解釋,這樣的編程語(yǔ)言叫做解釋型語(yǔ)言或者腳本語(yǔ)言(Script),完成解釋過(guò)程的軟件叫做解釋器。

編譯型語(yǔ)言的優(yōu)點(diǎn)是執(zhí)行速度快、對(duì)硬件要求低、保密性好,適合開發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫(kù)等。

腳本語(yǔ)言的優(yōu)點(diǎn)是使用靈活、部署容易、跨平臺(tái)性好,非常適合 Web 開發(fā)以及小工具的制作。

Shell 就是一種腳本語(yǔ)言,我們編寫完源碼后不用編譯,直接運(yùn)行源碼即可。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Shell是怎么連接用戶和內(nèi)核的”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

網(wǎng)站題目:Shell是怎么連接用戶和內(nèi)核的
瀏覽地址:http://muchs.cn/article32/pdpopc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航微信公眾號(hào)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司