iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 2
2
Software Development

Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單系列 第 2

Day02-Shell 是什麼?

直譯式語言

在說明 Shell 是什麼之前,我們先來談談什麼是直譯式語言,懂了之後會更容易理解 Shell 所扮演的角色

程式語言大致上可以分為 編譯式直譯式 兩種,編譯式語言需要把程式碼編譯成執行檔才能執行,C/C++ 跟 Go 屬於這類;而直譯式語言不用經過編譯,而是直接由直譯器一句一句執行程式碼,你給他什麼指令他就馬上執行,Python 跟 JavaScript 屬於此類

直譯器(Interpreter)

以下面這個 Python 的例子來說,一開始執行的 python 就是 Python 語言的直譯器 ,在直譯器裡輸入一行指令,它就馬上幫你執行,如果你的輸入不符合 Python 語法,他就會噴錯

所以我們可以說「 python 這個程式是 Python 語言的 直譯器 ,他能看懂 Python 的語法」

Shell & Shell Script

聰明的你應該猜到我要說什麼了吧:我們平常在終端機下的指令像是 rm fileecho Hello 用的就是 Shell Script 的語法,而 Shell 會負責處理這些指令,所以我們可以說「Shell 就是 Shell Script 的 直譯器 ,他能看懂 Shell Script 的語法」

另外,大部分的 Shell 都會有像這樣的輸入介面稱作 prompt,通常會包含你的使用者名稱跟你所在的資料夾,看到那個游標在那邊就會有種很想輸入指令的感覺對吧(?),所以也可以說 Shell 會負責呈現一個可以讓你輸入指令的介面

為什麼 Shell 有那麼多種?

就像在 Day 1 中提到的,比較廣為使用的 Shell 有 bash、zsh 跟 fish 幾種,因為說穿了,Shell 就是能看懂 Shell Script 語法的程式而已,所以只要你知道 Shell Script 的語法,你就可以自己寫出一個 Shell

Shell 是怎麼執行指令的

ls 指令時發生了什麼事?

首先 Shell 會收到你下的指令 ls,接著他就會去找一個叫做 ls 的執行檔,這個執行檔放在 /bin 裡面,只要到裡面看一下就會看到 ls 這個執行檔,包括常用的 cp, mv, rm 等等指令也都是以執行檔的樣子放在裡面

所以 你下的指令其實是執行某個執行檔 ,這些常用的執行檔(指令)系統已經幫你裝好了

Shell 怎麼知道要到 /bin 去找執行檔

因為系統裡面有一個環境變數 PATH 記錄了執行檔放在哪些地方,以我的電腦來說 PATH 長得像這樣 /usr/local/bin:/usr/bin:/bin:...,以冒號作為分隔點可以隔出很多個路徑 [/usr/local/bin, /usr/bin, /bin, ...]

當你下 ls 指令時,Shell 就會照順序尋找 ls 這個執行檔,先到 /usr/local/bin 找找看有沒有 ls,沒有的話就再往 /usr/bin 找,就這樣一直找下去,如果在某個地方找到了就執行它,若是都沒找到就跟你說 command not found

Shell vs Terminal

講完 Shell 了之後順便說說一個跟他很像的東西:Terminal(終端機),有很多人都會搞混終 Terminal 跟 Shell,甚至誤以為 Terminal 跟 Shell 是同一個東西,反正就是那個黑底白字會出現在電影裡的畫面XDD

其實 Terminal 只是用來跟 Shell 互動的工具而已,他們兩個是合作的關係:

當我下指令 ls 並按下 Enter 時,Terminal 會負責把 ls 這個字串傳送給 Shell 執行,Shell 執行完會把 純文字 的結果回覆給 Terminal,Terminal 再根據字型、字體大小等等樣式把結果呈現出來

iTerm2 vs Terminal vs Hyper

下面我們來比較三款 Terminal,從左到右依序是 iTerm2、內建 Terminal 跟 Hyper,我在三個 Terminal 裡面都下了一樣的指令 ls -la

就像上面提到的,因為文字部分是由 Shell 執行指令後產生的結果,所以可以看到三個 Terminal 內的文字內容一模一樣;但在樣式方面可就差得多了,因為每個終端機有他預設的背景顏色、字型、間距等等,差距非常大

所以可以知道其實 Terminal 就是負責把 Shell 執行的結果呈現出來而已,而真的執行指令是 Shell 的任務,跟 Terminal 一點關係都沒有

小結

大家看完今天有沒有更了解 Shell 跟 Terminal 呢?如果有什麼問題歡在下面留言,沒問題的話明天就要正式開工囉~

參考資料


上一篇
Day01-系列文介紹、規劃
下一篇
Day03-開工囉
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30

尚未有邦友留言

立即登入留言