什么是linux命令?很多人看到這個(gè)問題,都會(huì)不以為意,認(rèn)為這不算是一個(gè)問題。很多人都知道命令是什么,但是對(duì)于剛接觸linux的朋友來說,還是對(duì)命令有很多困惑。我們?cè)趌inux命令行下敲的命令,最終會(huì)被計(jì)算機(jī)執(zhí)行,這中間發(fā)生了什么?背后的原理是什么?這是我在最開始學(xué)習(xí)linux的時(shí)候困擾最久的問題。當(dāng)然這些問題不是一篇文章就可以解釋的了的,這需要對(duì)計(jì)算機(jī)原理、linux內(nèi)核有深入的了解,才能寫出完美的答案。
linux企鵝
但是我們可以先了解一下基礎(chǔ)的原理,這樣在實(shí)踐命令的時(shí)候才會(huì)有更好的效果。下面我講解一下自己對(duì)命令的理解。
我們?cè)诿钚邢虑妹畹臅r(shí)候,其實(shí)是在跟一個(gè)叫shell的程序打交道,shell會(huì)根據(jù)用戶敲的命令名字,在環(huán)境變量PATH指定的路徑下尋找和命令名字匹配的一個(gè)可執(zhí)行文件,找到后shell會(huì)創(chuàng)建一個(gè)子進(jìn)程,在子進(jìn)程中加載并執(zhí)行該可執(zhí)行文件。所以我們平時(shí)敲的大部分命令都是一個(gè)已經(jīng)存在的可執(zhí)行文件,那么這個(gè)可執(zhí)行文件放在哪里呢,通過whereis就可以看到命令所對(duì)應(yīng)的可執(zhí)行文件的路徑了,例如要看看ls這個(gè)命令在哪里,就執(zhí)行
whereis
ls就可以看到ls的路徑了。如果你把這個(gè)文件刪掉,那么shell就會(huì)告訴你找不到這條命令。大部分命令都是一個(gè)可執(zhí)行文件,但是我們?cè)谟脀hereis查看cd命令的可執(zhí)行文件路徑的時(shí)候,shell的輸出是這個(gè)樣子的:“cd:”,竟然沒有路徑名,這是什么鬼?
這是因?yàn)閏d是shell的一個(gè)內(nèi)置命令,不以可執(zhí)行文件的形式存在。所以咱們平時(shí)敲的命令主要分為兩種,一種是以可執(zhí)行文件存在的外部命令,一種是沒有可執(zhí)行文件的內(nèi)置命令。這里的外部和內(nèi)置是從shell的角度說的。那么怎么判斷一條命令是shell內(nèi)置命令還是外部命令呢,用type查看就可以了,比如查看cd,在命令行下敲type
cd,shell的輸出是cd is a shell builtin。那么cd就是一條shell內(nèi)置命令。
說了這么多,好像還沒有解釋shell是什么東西,簡(jiǎn)單來講,shell就是一個(gè)命令解釋器,shell和咱們敲的這些命令都是一樣的,都是運(yùn)行在linux內(nèi)核之上的應(yīng)用程序,在內(nèi)核的眼里都是內(nèi)核要調(diào)度執(zhí)行的進(jìn)程。這些進(jìn)程在運(yùn)行之前,都是一個(gè)一個(gè)的可執(zhí)行文件。只是shell是在linux啟動(dòng)之后就會(huì)由init進(jìn)程自動(dòng)加載執(zhí)行的。他也對(duì)應(yīng)著一個(gè)可執(zhí)行文件。可以通過查看/etc/passwd文件中每條記錄的最后一個(gè)字段查看每個(gè)用戶在啟動(dòng)后執(zhí)行的shell可執(zhí)行文件路徑,也可以通過SHELL環(huán)境變量查看當(dāng)前啟動(dòng)的shell。echo
$SHELL
那么上面提到的環(huán)境變量又是什么東西呢?可執(zhí)行文件是什么?他從哪里來?是怎么被加載到內(nèi)核中變成一個(gè)可調(diào)度的進(jìn)程的呢?shell是怎么創(chuàng)建子進(jìn)程的呢?進(jìn)程又是什么鬼?shell是被init進(jìn)程啟動(dòng),init(systemd)進(jìn)程又是什么?linux的啟動(dòng)流程是怎么樣的?進(jìn)程是如何被內(nèi)核調(diào)度的?說到這里,好像問題越來越多了,本來只是一個(gè)命令的問題,現(xiàn)在又引出這么多問題。技術(shù)就是這樣,知道的越多,不知道的也就越多。歡迎關(guān)注本頭條號(hào),我會(huì)在后面的文章持續(xù)為大家解答這些問題。本人水平有限,歡迎批評(píng)指正。