用了這麼多年Linux,你清楚控制臺、終端與shell及它們的關係嗎?

2021-01-10 itworld123

我們在使用Linux的時候會經常遇到終端和shell的概念。比如在桌面版的Ubuntu上面,我們可以在桌面上右擊滑鼠,點擊「Open Terminal」來打開一個終端。此時,我們就可以在該終端中輸入Linux命令了。有人可能會問,這不是shell嗎?那麼終端和shell到底是什麼關係呢?

1什麼是終端

對於什麼是終端,我們先看一個定義。可以看出終端就是一個輸入輸出設備,簡單的可以理解為滑鼠,鍵盤和顯示器。但是這個好像跟Linux中終端的概念有些出入,下面聽我來娓娓道來。

a combination of a keyboard and output device (such as a video display unit) by which data can be entered into or output from a computer or electronic communications system.

但如果想理解了解什麼是終端,還需要從「遠古」時期說起。在1970年之前,那個時候還沒有個人電腦。那個使用只有大型機和小型機,也就是衣櫃那麼大的計算機。當時比較著名的計算機如DPD-7和GE-45等。

當時Ken Thompson和Dennis Ritchie(就是下圖中的兩位大神)負責在DPD-7上面開發一個新的作業系統,沒錯,就是UNIX作業系統。為了提高計算機的使用效率,他們打算讓這個作業系統支持多個用戶同時使用這臺計算機。

但是,當時的顯示器是一個非常貴的設備,不太可能每個人都有一個顯示器。因此兩個人想出了一個變通的方法。他們選擇了便宜的電傳打字機來做終端設備。這個電傳打字機(TeleType)就是ASR33,就是下圖這個設備。

這個設備通過鍵盤將信息輸入計算機當中,而計算機的輸出則是通過上面的紙列印出來。這樣UNIX就成為世界上第一個支持多用戶的作業系統,而ASR33則成為第一個Unix終端。後來,縮寫TTY也就是用來表示Unix或者Linux終端了。

隨著技術的發展和硬體價格的不斷降低,終端也變得越來越先進和便宜。1970年,DEC發明了VT05視頻終端。就是下面這個東東,可以看出她有個小顯示器。也越來越像現在的鍵盤顯示器了。

聊到這裡我們知道了,所謂終端,其實就是一個物理設備,也就是計算機的輸入輸出設備。

2什麼是控制臺

在上個世紀70年代,終端是通過線纜連接在主機上的。同時,在主機上還有一種特殊終端,它是直接集成在主機上的。這個特殊的終端被稱為控制臺。這個終端的特點是只能被管理員使用。每一個計算機只有一個控制臺,它在外觀上與普通終端並沒有太大的差異,但最重要的是控制臺可以做一些普通終端不能做的事情。

比如當作業系統出現啟動失敗的時候,它會列印一些信息到控制臺上,但終端並不會收到該信息。另外,當作業系統以單用戶模式啟動的時候,我們就只能通過使用控制臺來登錄了。這個時候其它終端是沒有權限登錄的。

3Linux作業系統的終端模擬器

前面我們了解到終端實際上是硬體設備,但是前面我們在Ubuntu上可以用菜單打開一個終端(Open Terminal)。其實,我們打開的這個窗口也是一個終端,我們稱這個終端為終端模擬器,它是用軟體的方式來模擬一個終端設備。有的時候我們又稱它為虛擬終端。

如果你使用的是gnome終端,我們可以通過下面命令看一下它的幫助問答。

man gnome-terminal

可以看出gnome-terminal就是一個終端模擬程序,而它的功能就是訪問Unix shell。

gnome是用來模擬Xterm的,而Xterm本身也是一個終端模擬器。它模擬了VT102物理終端。

打開Linux虛擬終端的方法有很多種,如果我們使用的是桌面版的Linux,也就是圖形界面版的。那麼通常我們可以通過命令打開一個命令行終端。如下所示。

另外,Linux作業系統起來的時候默認是有7個虛擬終端的。這些虛擬終端並非前面所說的在桌面中打開的虛擬終端,而是通過顯示器直接顯示的。我們可以通過快捷鍵在這些終端之間進行切換,比如Ctrl+Alt+ F1可以切換到第一個終端,而Ctrl+Alt+ F2可以切換到第二個終端,以此類推Ctrl+Alt+F7可以切換到第七個終端。通常情況下對於圖形界面來說,第七個是圖形終端,其它是文字終端。

通過前面的介紹,我們從外面理解了關於終端、控制器和虛擬終端等概念。也對Linux作業系統中虛擬終端有所了解。接下來我們將進一步的深入介紹到Linux的內部。

4什麼是Shell

其實我們在前面文章中介紹過關於Shell的內容。Shell其實就是一個應用程式,它實現了用戶對作業系統訪問的接口。比如我們常見的管理文件,用戶和網絡資源等等,都是通過Shell來完成的。

Shell是一個應用程式,同時它又有很多具體的實現,比較常見的包括Bash、Zsh、 Csh和Ksh等等。

我們前面了解到終端是個物理設備,它被用戶用來輸入和現實信息,而目前我們使用的虛擬終端則是對物理設備的模擬。Shell則是用來執行用戶命令的。這樣我們現在就很容易理解終端和Shell的關係。

如果我們通過桌面版打開一個虛擬終端的話,那麼終端和Shell的關係如下圖所示。

如果我們不是通過本地的設備連接的,而是通過網絡來訪問計算機的話,那麼其關係如下圖所示。可以看出,這裡面有個pty的組件起了比較關鍵的作用,它建立了兩者之間的關聯。

1Linux系統中的tty、pty和pts

前面我們從概念層面對終端、控制臺和shell等進行了介紹。但是這些概念在Linux作業系統中是怎樣的呢?它們之間的關係又是怎樣的呢?

前面已經介紹過tty,它是一個終端,也就是一個輸入輸出設備的集合。而目前在Linux中都是通過虛擬終端來與計算機交互的,因此在Linux中tty其實就是虛擬終端,可以將其理解為一個軟體。如果我們同時按住Ctrl+Alt+F5就可以切換到虛擬終端5,具體如下。

在Linux作業系統中,軟體的整體架構要複雜一些,這是因為Linux不僅僅要支持虛擬終端,還有能夠支持鍵盤顯示器的物理外圍設備,還要支持通過telnet或者ssh等網絡的形式的連接。如下圖給出了一個完整的示例。

為了支持不同類型的接入方式,在Linux實現了一個偽終端的概念,也就是pty。其中p是pseudo的縮寫。

偽終端分為兩部分,如上圖所示,包括master和slave兩部分。其中master實現了對不同接入方式的適配,它實現對來自不同設備或者軟體消息的解析,將結果傳輸給slave;而slave端其實就是一個虛擬終端,它實現了與shell的交互,對於shell來說,ptsiu是一個終端設備。

可能還是不太好理解,我們舉一個具體的例子,比如telnet實現對遠程計算機的管理,其實在客戶端就是發送的各種字符串,通過網絡發送給telnet守護進程,然後telnet守護進程調用master的功能實現解析。

今天我們主要從概念和架構的層面介紹了終端、控制臺和Shell等概念,並介紹了Linux作業系統中常見的諸如tty、pty和pts等名稱。後面我們以一個具體的實例來讓大家更加清楚的理解上述架構。

相關焦點

  • Linux系統下Java通過shell腳本監控重啟服務
    思路 java程序獲取linux進程信息可以通過shell腳本獲取進程信息、通過讀取proc文件系統獲取進程信息。 但是為了系統的安全性、方便維護等角度出發,更多的是java通過shell獲取和linux交互能力。
  • 如何將 Linux 終端中命令的輸出保存到文件中 | Linux 中國
    當然你可以在 Linux 終端中複製和粘貼,但是有更好的方法可以在 Linux 命令行中保存 shell 腳本或命令的輸出,讓我演示給你看。 本文字數:1659,閱讀時長大約:2分鐘 https://linux.cn/article-12920-1.html 作者:Abhishek Prakash 譯者:MjSeven 當你在 Linux 終端中運行命令或腳本時
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    當Windows 10的升級提示從你計算機的右下角彈出時。你可以不假思索的點擊『馬上升級』嗎?我想大多數人對這個問題的答案是否定的。為什麼?因為大多數情況下。升級之後就會變得更卡。延遲更大。一些無用而龐大的軟體瘋狂的佔用你有限的計算機資源。而如果你選擇的是Linux。你幾乎可以任意的在計算機上安裝軟體。運行程序(如果你的內存不是太小。且硬碟交換分區足夠的話)。
  • 認識Linux系統以及Shell
    Linux系統的shell是一個解釋器,是保護系統內核不被篡改的軟體,一般所使用的系統中默認啟動的shell是bash。Linux系統在shell中執行命令:1、行提示符例:[kiosk@foundation0 Desktop]$1)kiosk :打開shell的用戶2)@ :分隔符
  • 在Windows系統和Linux系統中,如何打造一個好終端?
    閱讀本文將帶你了解如何在系統上獲得很棒的shell +終端。術語shell用於執行命令。終端(terminal)是運行shell的包裝器。在終端上可以設置字體、字體大小、配色方案以及支持多個選項卡。終端仿真器的示例包括GNOME終端、KDE的Konsole,Terminator和XTerm。
  • Linux Shell通配符、元字符、轉義符最全使用攻略
    一、linux shell通配符(wildcard) 通配符是由shell處理的(不是由所涉及到命令語句處理的,其實我們在shell各個命令中也沒有發現有這些通配符介紹), 它只會出現在 命令的「參數」裡(它不用在 命令名稱裡, 也不用在 操作符上)。
  • Linux shell命令總結大全
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言Linux shell命令應該算是非常入門的東西,權當給大家做個記錄。但是實際上在使用的時候,會遇到各種各樣的問題,前幾天我在我們的項目上需要做一個功能,根據進程名字殺死這個進程,下面是過程1、我們正常需要的操作是$ps |grep xxx $kill -9 xx2、kill命令是常用的,但是用killall
  • Linux:每次啟動終端時,用最喜歡的名言以及彩虹色打招呼
    這篇文章借鑑於國外的一個網友提供的素材,希望大家能從中學到很多 如果您喜歡一些名言,並且在啟動Linux終端時,他能用彩虹色出來。讓我們看看如何實現這一目標。在繼續之前,請在您的Linux終端上觸發以下命令。
  • 12個有趣的Linux終端命令
    你覺得 Linux 終端裡只有無趣的工作嗎?那你一定不知道下面這些有趣的 Linux 命令吧。Linux 終端是用來完成複雜的工作的,我們有很多有用的 linux 命令奇技淫巧來幫助你。但是,你知道你還可以用終端來做很多有趣的事嗎?如果你不知道,沒關係,大多數 Linux 用戶也都只把終端視為一個用來管理系統和開發工作的交互界面。
  • 如何用Shell監控文件變化?
    如何用Shell監控文件變化? 文件監控可以配合rsync實現文件自動同步,例如監聽某個目錄,當文件變化時,使用rsync命令將變化的文件同步。
  • 讓medit 成為你的下一個 Linux 代碼編輯器
    如果你正在尋找經典的 gedit 體驗(大約是 Gnome 2 上),那麼 medit 可能無意間提供了一種出色且現代的近似體驗。它也有許多額外的功能,比如可以使用 Python、Lua 或 C 語言編寫插件,以及甚至可以將 shell 腳本集成到菜單系統。所有其他常用的功能也都在這裡:標籤式界面、一個即時的 shell、縮進管理、語法高亮等等。
  • eDEX-UI:一款科幻風格的酷炫 Linux 終端仿真器
    本文字數:1528,閱讀時長大約:2分鐘 https://linux.cn/article-12655-1.html 作者:Ankush Das 譯者:Xingyu.Wang 你可能已經知道了大量有趣的 Linux 命令
  • 編寫Linux Shell腳本的最佳實踐
    /a.sh來執行這個腳本的時候,如果沒有shebang,那麼它就會默認用$SHELL指定的解釋器,否則就會用shebang指定的解釋器。 不過,上面這種寫法可能不太具備適應性,一般我們會用下面的方式來指定: #!/usr/bin/env bash  這種方式是我們推薦的使用方式。
  • 關於 Shell中常見參數及判斷命令
    今天為大家分享一篇對shell中常見參數及判斷命令介紹,具有很好的參考價值。
  • linux各個目錄代表什麼
    基本文件系統類型:linux有四種基本文件系統類型:--普通文件:如文本文件、c語言原始碼、shell腳本等,可以用cat、less、more、vi等來察看內容,用mv來改名;--目錄文件:包括文件名、子目錄名及其指針,可以用ls列出目錄文件;
  • 老外告訴我shell out意思是付帳,shell貝殼怎麼會和付款扯上關係
    Shell out的意思是為…花費一大筆錢,它的英文釋義為If you shell out for something, you spend a lot of money on it.例如:I had to shell out a lot of money for my new car
  • Linux系統的Linux應該怎麼讀?正確讀法在這裡,很多人都讀錯了!
    1、linux發音五花八門版本頗多,見到和聽到的不下10種。根據linux的創始人Linus Torvalds的說法,Linux的發音和「Minix」是押韻的。3、有人綜合網上和linux自己的讀音,概括出幾個自認為最合適也最通用的讀法:/li'n^ks/(「裡那克斯」)或/'li:nэks/(「裡訥克斯」)或/li'nju:ks/(「裡紐克斯」)。4、這幾個應該是誰都聽得懂的。至於哪個比較正宗,當然是linux的原因。但事實上使用linux哪種讀法的人似乎都不在少數。
  • 資料|《Linux 命令行與 shell 腳本編程大全》
    今日資料推薦《 Linux 命令行與 shell 腳本編程大全》這是一本關於 Linux 命令行與 shell 腳本編程的全方位教程,主要包括四大部分:Linux 命令行,shell 腳本編程基礎,高級 shell 腳本編程,如何創建實用的 shell 腳本。
  • 超級小白帖:如何在Linux終端中複製粘貼
    如果你從Linuxprobe網站複製一個命令示例(使用通用的Ctrl+C鍵),你可以使用Ctrl+Shift+V將這個命令粘貼到終端中。 同樣,你可以使用Ctrl+shift+C從終端中複製文本,然後使用常規的Ctrl+V快捷鍵在文本編輯器或Web瀏覽器中粘貼。
  • Linux提權的幾種常用方式
    (3)執行成功,返回一個root權限的shell。1.3 Linux提權輔助工具github項目地址:https://github.com/mzet-/linux-exploit-suggester.git