首頁 > 軟體

關於Unix/Linux的終端、偽終端、控制台和Shell

2020-06-16 17:05:38

歷史是什麼:是過去傳到將來的回聲,是將來對過去的反映。  ——雨果(法)《笑面人》

閱讀本文大概需要花費你15分鐘

文章導航:

  1. 計算機的發展
  2. UNIX系統的誕生
  3. UNIX系統的發展
  4. 終端與控制台
  5. 什麼是shell
  6. GUI和偽終端

1. 計算機的發展

        第一台計算機是什麼時候誕生的?這不是一個容易回答的問題,因為有很多不同的“計算機”定義的分類,比如機械計算機、電子計算機,我甚至可以將算盤也定義成一種計算機。

       1946年2月14日(美國時間2月15日 :D),世界上第一台電腦 ENIAC 在美國賓夕法尼亞大學誕生。它發明的目的是用於二戰,這部機器使用了18800個真空管,長50英尺,寬30英尺, 占地1500平方英尺,重達30噸(大約是一間半的教室大,六隻大象重)。它的計算速度快,每秒可從事5000次的加法運算,運作了九年之久。吃電很兇, 據傳ENIAC每次一開機,整個費城西區的電燈都為之黯然失色。

        另外,真空管的損耗率相當高,幾乎每15分鐘就可能燒掉一支真空管,操作人員須花15分鐘以上的時間才能找出壞掉的管子,使用上極不方便。曾有人調侃道:“只要那部機器可以連續運轉五天,而沒有一隻真空管燒掉,發明人就要額手稱慶了”。

下面的圖片就是 ENIAC 的真身:

從上面的圖可以看出早期的計算機是多麼龐大和笨重,下面看一下早期計算機的設定

 歷史記憶體大小及其價格

  時間  生產商 大小(KB) 銷售價(美元) 造價(美元)/MB
  1957  C.C.C. 0.00098 392 411,041,792
  1960 E.E.Co. 0.00098 5 5,242,880
  1965 IBM 0.00098 2.52 2,642,412
  1970 IBM 0.00098 0.70 734,003
  1975 MITS 0.25 103 421,888
  1980 Interface Age 64 405 6,480
  1985 Do Kay BYTE 512 440 880
  1990 Unitex BYTE 8,192 851 106
  1995 Pacific Coast Micro 16,384 494 30.9
  2000 Crucial 65,536 72 1.12
  2005 Corsair 1,048,576 189 0.185
  2010 Kingston 8,388,608 99 0.0122
  2013 Crucial 16,777,216 88 0.0054
  2014 Patriot 32,000,000 294 0.0091

       從表格中可以看到,1995年,電腦的記憶體大概在16M的規模,2000年的時候,大概在64M的規模,價格約500元人民幣,此時我才小學四年級??對此沒有印象,但相信有的人對此記憶猶新吧。

       1960年時,計算機的價格是令人難以承受的,早期的大型計算機的價格大約是在500萬美元到1000萬美元之間,每個月按月出租也需要17000美元,這樣昂貴的裝置只有大公司和大學教育機構才能負擔的起。

2. UNIX系統的誕生

       由於大型電腦過高的價格,美國國防部部門想要在這樣的計算機上開發出一套系統multics:該系統通過建置在美國通用電力公司的大型電腦GE-645,來連線1000部終端機,支援300的使用者同時上線。通俗來說,就是國防部門想要一個分時作業系統達到註冊使用者1000人,最高並行300人的效果。

下圖是類似GE645的GE-235大型電腦:

       該專案由AT&T、通用電器公司、麻省理工學院參與,經過4年時間,最終還是失敗。兩位神一樣的人物:Ken Thompson和Dennis MacAlistair Ritchie 在此之後發明了UNIX和C語言。Ken Thompson參與了multics專案,從中獲得經驗和靈感,並利用小型機pdp-7開發出了UNIX,之後還和Dennis MacAlistair Ritchie共同發明了C語言,並用C語言重寫了UNIX使其可以在不同品牌的機器上快速移植。

下面是小型機pdp-7的圖片,該型號小型機目前在美國的西雅圖Living Computer Museum(活電腦博物館)還能看到。

3. UNIX系統的發展

       隨後,由於UNIX易用、可移植且免費,之後迅速擴散開來,但UNIX是Ken Thompson和Dennis MacAlistair Ritchie在AT&T公司的貝爾實驗室工作期間鼓搗出來的,版權屬於AT&T,起初AT&T由於壟斷電信通訊業務,美國政府不允許其涉足計算機行業,另外AT&T也覺得UNIX是個小玩意不掙錢,未予關注,任其發展。後來UNIX壯大後,AT&T欲利用UNIX從事商業軟體活動,作為其商業產品欲營利,為了一家獨大,AT&T想要收回起初免費使用UNIX的權利。而此時UNIX已經因為原始碼公開而形成了很多的實現和版本。

總結來說:1969年Ken Thompson在AT&T公司發明了Unix系統,而後Thompson在加州大學伯克利分校和AT&T公司的Unix部門各自維護了一個實現,分裂成了2種版本。

分裂的2種版本各自吸收使用了對方的一些特色和專有原始碼,並相互起訴,最終和解。

分裂的2種版本導致各種不同的演化,結果是UNIX的各種實現很亂,上層的應用程式不便移植,最後大家要求統一,最終由此產生了統一標準。

總之,UNIX分裂成了兩大主流分支,很多其他的分支實現基本上是基於BSD或者System V。

4. 終端與控制台

       Ken Thompson和Dennis MacAlistair Ritchie發明的UNIX可以在pdp-7上使用,相比於大型電腦500萬—1000萬美元的價格雖然不多,但pdp-7的價格也不菲,高達72000美元。仍然沒有辦法人手一台,但總算讓一個普通公司有可能採購了。

       一台小型機有控制台、Terminal終端、主機三大部分。在文章的第二個圖片“類似GE645的GE-235大型電腦”那裡,為什麼我要貼那樣的照片?就是想讓你直觀感受一下:小型機有控制台、Terminal終端、主機。

       想象一下,我們平時用的桌上型電腦器:主機+鍵盤+顯示器,這裡的主機就和以前的小型機的主機一樣,負責計算,內含CPU、主機板等原件。今天的桌上型電腦,主機負責執行作業系統,跑程式,鍵盤負責打字輸入,顯示器負責輸出顯示結果。

       那麼以前的小型機的控制台和Terminal終端是幹什麼用的?控制台,英文叫做console,從字面意思可以看出是用來做控制的。回憶一下課本上關於計算機作業系統發展歷史的說明:

最初的電腦並沒有作業系統,人們通過各種操作按鈕來控制計算機,後來出現了組合語言,操作人員通過有孔的紙帶將程式輸入電腦進行編譯。這些將語言內建的電腦只能由操作人員自己編寫程式來執行,不利於裝置、程式的共用。為了解決這種問題,就出現了作業系統,這樣就很好實現了程式的共用,以及對計算機硬體資源的管理。

那時候,一台大型電腦或者小型機的使用,不僅有程式設計師寫程式,還有專業機器操作人員和管理人員,每個人有每個人所負責的部分,各人分工不同。這裡的管理人員就是對計算機進行控制的工作人員。那麼,控制計算機什麼呢?需要在計算機啟動時控制它的各個硬體,比如暫存器,拔插各種連線線,可以回頭看一下本文開頭關於 ENIAC 的圖片,上面是不是很多的線需要連線?另外還要根據系統啟動和執行時的實時情況來檢視指示燈的狀態和系統執行的告警、錯誤等紀錄檔資訊,這就是控制台。從這裡的說明可以看出,控制台因為要控制硬體和連線線,所以務必是要直接連線在大小型機的主機上的。

下面圖中紅色方框的就是console了:

 

有了console控制台,可以控制大小型機的啟動和對其進行硬體管理,但計算機是拿來提供服務的,只能管理是遠遠不夠的,如何為使用者或者程式設計師提供服務呢?那就是通過終端terminal來和計算機進行互動,告訴計算機你想要做什麼,然後計算機在終端中顯示處理的結果。

通常在系統啟動之前,終端是不能連線到主機的,只能console控制台連線。下圖就是console和terminal的實物圖:

 從圖中,我們可以看到,一個顯示器樣的螢幕和一個鍵盤,這就是終端terminal,用來輸入輸出,和計算機互動的裝置。至此,我們應該徹底明白,console控制台和terminal終端的區別了:一個負責控制;一個負責供使用者使用,與計算機進行工作互動。那麼,在這裡有一個問題:在Linux系統上,當你按下CTRL + ALT + F1時啟動的那個黑色介面是console還是terminal?答案是terminal,為什麼?因為你是在那裡進行登入後與計算機互動。當你重新啟動Server版純命令列的Linux系統時,會看到螢幕上有很多的資訊輸出,那一刻你的螢幕則是console控制台的角色。

       UNIX是從multics獲得的靈感,而multics設計的初衷就是多使用者,基於pdp-7開發出的UNIX自然也是一個支援多使用者的作業系統,但pdp-7只有一個終端,只能同時一個使用者使用,如何支援多使用者呢?Ken Thompson和Dennis MacAlistair Ritchie使用了電傳打字機來替代終端,電傳打字機的英文名稱是Teletype,縮寫為TTY。電傳打字機帶一個鍵盤,也能列印紙張進行文字輸出,而且價格低廉,因此可以用來作為UNIX的另一種終端。

       需要注意的是,起初Terminal終端和TTY打字機並不是同一種東西,Terminal終端是只有一個,而TTY打字機可以有一到多個。另外,Terminal終端是本地,TTY打字機是遠端,此遠端非今天的網路遠端,是地理位置上的遠端,比如TTY打字機用很長的線纜連線到小型機的插口上,無需網際網路,而且當時也沒有網路。因為TTY打字機是一種終端裝置,硬體連線到主機,所以終端的數量也是有限的。由於Terminal終端和TTY打字機扮演的終端的功能相同,所以後來用TTY來統稱各種型別的終端裝置。另外,之後的TTY終端裝置可以通過串列埠來連線主機進行通訊(序列點到點),這個名字也用來指任何的串列埠終端裝置。

       無論使用本地Terminal終端還是TTY打字機終端登入系統時,都屬於終端登入,與此相對應的是網路登入,進而引申出來偽終端,至於什麼是偽終端,我們稍後再講解。

下面的圖就是電傳打字機:

        仔細觀察上圖電傳打字機的鍵盤,細心的讀者會發現,該打字機的鍵盤和我們今天的鍵盤不太一樣,少了好幾個按鍵,比如上下左右,比如回車(Enter),比如刪除(有的還沒有退格鍵),但也多幾個按鍵,比如第二排的最後兩個鍵。

        前面我們說過,電傳打字機帶一個鍵盤,也能列印紙張進行文字輸出。電傳打字機的輸出印在紙上,使用者輸入的字元就像打字機一樣也是刪不掉的,而且使用者輸入什麼就會立刻傳給主機;後來有了以電子顯示器為輸出裝置的終端,一開始也只能一個字元一個字元地給主機發資訊,到七十年代末能用終端裝置自帶的緩衝來快取使用者輸入的資訊,然後再一次性給主機傳送一整行資訊的「智慧」終端才成為主流。由於終端裝置能夠進行快取,所以在傳送給主機之前可以進行修改錯誤的輸入,此時鍵盤上才有了現代電腦使用者覺得司空見慣的上下左右方向鍵和刪除退格鍵,以便對輸入進行修改。

        這裡還涉及到一個歷史典故:回車和換行的故事。從上面的電傳打字機的圖片中可以看到,該打字機每次列印一行,列印一行之後磁頭和紙張接觸的那個地方位於紙張當前行的最右側,磁頭要回到紙張的下一行最左側的地方繼續列印,從上一行最右側移動到下一行最左側這個過程需要耗費0.2秒,這0.2秒內正好可以打兩個字元。如果一行只能列印10個字元,而打字機收到連續20個字元,那麼在打完10個字元之後,換到下一行用去的0.2秒就會導致有2個字元沒列印出來而丟失,最終只有18個字元。

        如何解決這個問題?研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做"回車",告訴打字機把列印頭定位在左邊界;另一個叫做"換行",告訴打字機把紙向下移一行。這樣剛好用迴車和換行這2個無意義字元佔用移動磁頭所需的0.2秒的時間空缺,也即打字機收到22個字元,1-10字元有意義,11-12字元為回車和換行,13-24字元有意義,在應該列印到11-12字元時,打字機換到下一行最左側,丟掉11-12字元,不會導致資訊錯誤。

       早期的打字機(計算機發明之前)似乎還是手動迴車和換行,所以上面的圖片能看到"迴車"(RE-TURN,第二排最後一個)和"換行"(LINE FEED,第二排倒數第二個)按鍵。後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,記憶體很貴(可以回頭看一下本文前面關於記憶體大小及其價格的表格),一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧,Unix系統裡,每行結尾只有"<換行>",即"n";Windows系統裡面,每行結尾是"<回車><換行>",即"rn";Mac系統裡,每行結尾是"<回車>"。一個直接後果是,Unix/Mac系統下的檔案在Windows裡開啟的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多出一個^M符號。

      當然,今天隨著技術的進步,早已沒有了換行和回車的區別,也就不再有RE-TURN和LINE FEED這兩個鍵,統一的使用Enter來替代了。

      之後,還是隨著技術的進步,CPU、主機板、輸入輸出裝置等裝置和緩衝技術的飛速發展,console控制台、tty終端這些不再是單獨的裝置,而是全部被現代的鍵盤和顯示器所整合、代替。因此,console控制台和tty終端也就消失了。現在計算機的console控制台和tty終端都是虛擬出來的概念了,在概念上,鍵盤和顯示器既是console,又是tty。至於什麼時候是console,什麼時候是tty,取決於那一刻在做什麼。比如在我們的系統啟動時,我們還能看的console控制台的影子。

下面的圖就是類UNIX系統啟動時的紀錄檔輸出,也是退化後的console(退化後的console不再管理各種連線線,簡單地保留了紀錄檔檢視的基本功能,或者當你忘記root密碼時,進行系統的“修理”)

 

5. 什麼是shell

在了解了什麼是終端和控制台之後,就很容易理解什麼是shell了。再次回憶一下,什麼是計算機系統?套用鳥哥的一句話:沒有插電的計算機是一堆廢鐵,那麼插了電的計算機是什麼? 答案是:『一堆會電人的廢鐵』! 是的,插了電的計算機只是一堆會電人的廢鐵而已,要想發揮計算機的作用,不僅要有硬體,還要有軟體,要安裝系統,要上網就要用瀏覽器,要聊天,就得安裝QQ。因此,計算機系統由計算機硬體和軟體兩部分組成。同樣的,終端也是有兩部分組成,一部分是終端的硬體:鍵盤+顯示器,另一部分就是shell軟體。你在終端裡面敲鍵盤打字,shell軟體接收你的輸入,然後傳遞給作業系統,作業系統接收後進行處理,處理完畢後返回。相信到這裡,shell是什麼概念就不言而喻了,用晦澀的術語來描述就是:shell是人機互動的介面。

6. GUI和偽終端

GUI是圖形介面的術語稱呼。

虛擬終端和偽終端不同,資源抽象,一個真實存在,一個為提供邏輯抽象而虛擬的介面。

最後,本文根據網際網路搜尋、部分書籍參考、部落格和問答社群以及英文翻譯綜合整理寫出,由於對整個計算機歷史並不了解,因此必然存在某些錯誤,懇請讀者予以批評和指正,感謝!

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-10/147315.htm


IT145.com E-mail:sddin#qq.com