終端、控制檯、tty、shell等區別與概念初辨析
歷史
控制檯 | 終端 |
---|---|
計算機內部 | 計算機外部 |
並口 | 串列埠 |
單計算機一個 | 單計算機多個 |
系統訊息、核心訊息、後臺訊息 | 使用者需要、可以知道的訊息 |
原生裝置 | 電纜、網路、鍵盤、顯示器等 |
console(一種機櫃) | terminal(電線的末端) |
早期計算機精貴,一臺主機,連很多終端,終端為主機提供了人機介面,很多人都通過終端使用主機的資源。終端有字元啞終端和圖形終端兩種。
而控制檯是另一種人機介面。 不通過序列線路與主機相連,直接安在主機上,,這是人控制主機的第一人機介面。
可以想象成主機上有塊面板,面板上方小燈閃,人得站著才能夠著它(控制檯),主機上面一些電纜延伸到很多人辦公桌的螢幕和鍵盤上(終端)。
當下
現代終端(模糊硬體與軟體)
1. 名詞解釋
- -------tty-------:代指所有終端裝置
- -------pyt-------:沒有實際裝置的其他虛擬終端
- --pts --ptmx--:兩者結合,進而實現pty,是pty的實現方法
tty(teletype):電傳打字機
ttyS(tty serial) :tty + 序列
pty(pseudo-tty):偽君子 + tty=偽終端
pts(pseudo-terminal slave):偽君子 + 終端 + 女僕=偽終端從端
ptmx(pseudo-terminal master):偽君子 + 終端 + 主人=偽終端主端
terminal和tty已經成為同義詞
2. 分類
串列埠終端 | 偽終端(pty) | 控制終端 | 控制檯終端 | |
---|---|---|---|---|
檔名 (/dev/) | ttyS(n) | ptmx、pts/n | tty | ttyn,console |
其他介面別名 |
pty[p-za-e][0-9a-f]
, tty[p-za-e][0-9a-f]
|
|||
用途 | 連線物理終端裝置 | 模擬終端與主機的通訊 | 指向當前所使用終端 | 模擬了型別為Linux的終端 |
開啟/檢視方式 | 終端模擬軟體,遠端主機 | 命令tty | alt + Fn |
3.類別解釋
串列埠終端
歷史上只有這些串列埠裝置才被叫做終端,也即現在的串列埠終端;
計算機把每個序列裝置看作一個字元裝置;
如你所知,Linux把裝置當作檔案;
對應的裝置檔名是,ttyS;
偽終端/模擬終端
通過X Windows(圖形介面)、SSH、telnet等登入主機所用的終端;
成對的邏輯終端裝置,包含主端和從端;
有兩套偽終端介面:
-
BSD
master(主端)為 pty[p-za-e][0-9a-f]
,slave(從端)為 tty[p-za-e][0-9a-f]
由於在程式設計時想找到合適的終端需要逐個嘗試,所以使用逐漸減少 -
UNIX 98
ptmx作為master裝置,每次開啟獲得master的資訊,動態生成pts/n
並不與實際物理裝置相關,大多數系統選擇這個介面作為pty實現
偽終端即假的,由模擬軟體(gnome-terminal,urxvt,mlterm,xterm、konsole等)模擬出來的終端,ctrl + alt + T出來的那個小黑框就是其中一種
對master的操作會反應到slave上
控制終端
控制終端是指能夠控制一個、一套裝置或者幾套裝置的終端控制器;
/dev/tty是一個應用程式概念,面對程序;
/dev/tty會對映到當前使用的終端,使用命令tty檢視其當前指向的“裝置”
- X Windows下(圖形化介面):對映到pts,也即你開啟的是偽終端
- 啞字元介面下(alt + Fn):對映到tty1-6中的一個,也即控制檯虛擬終端
tty(控制終端)會對映到你正在使用的任何型別的終端上,用tty命令檢視
控制檯終端/virtual consoles虛擬控制檯
- 控制檯終端(/dev/ttyn)是在系統視訊監視器上全屏的顯示終端;
- 其特殊性在於系統自動建立了64或6或10個(說法不一),且與cosloe關聯;
- tty0較特殊,指向當前控制檯終端,即你正在使用的ttyn;有些ttyn,如tty1,tty2可能由圖形化介面佔用;
-
圖形介面下:alt + Fn(ttyn)切換
啞終端下:ctrl + alt + Fn(ttyn)切換
詳見“現代控制檯”
4. 其他名稱解釋
啞終端(瘦客戶端)
早期的計算機終端是通過序列RS-232通訊的,它只能解釋有限數量的控制碼(CR,LF
等),但沒有能力處理執行特殊的轉義序列功能(如清行、清屏或控制游標的位置)。
總之就是很有限,很基本的終端;
X Windows下按ctrl + alt + Fn(n為特定數字時是X Windows),其他時候按alt + Fn;
你得到的虛擬控制檯終端,就是模仿的字元啞終端。
智慧終端(胖客戶端)
智慧終端就是有能力處理轉義序列,也就是說處理能力較強的終端機。
虛擬終端
本質上現代的終端都虛擬化了,但虛擬終端可特指偽終端,或者說模擬終端
- 串列埠終端需要外接一個真的物理上的終端,一般個人PC很少用到
- 控制終端比較特殊,是對其他的終端對映和管理,指的是當前用到的那個終端
- 控制檯終端也叫虛擬控制檯,可以理解為虛擬終端的高許可權版本
- 所以,一般人在PC上會開啟的都屬於虛擬終端
虛擬控制檯
與控制檯終端同義
注意不要混淆虛擬終端與虛擬控制檯
虛擬終端廣義上包含虛擬控制檯
現代控制檯
1. 控制檯與終端區別
- 控制檯:直接連到機器上的物理主終端(primary teminal)
- 終端:文字的輸入輸出環境
- console:/dev/console是系統控制檯,必須開啟支援控制檯的物理實際裝置;本質上是一種訪問核心的方式;一邊基於PC的顯示器鍵盤等物理控制檯,一邊面向使用者。
在一些作業系統(比如Linux和FreeBSD)中console有多個tty(用特定的組合鍵能夠在這些tty之間切換)。有時他們的命名很混亂,作業系統文件可能把那些tty叫做”console“ ”virtual console“ ”virtual terminal“等
/dev/console類似一個一個緩衝結果,用來實現對核心的列印,比如核心把要列印的內容裝入緩衝區,然後由console來決定列印到哪裡吧(如tty0或單使用者模式)。所以說/dev/console是用來外接控制檯的。
2. Linux控制檯
-
過去
/dev/console預設是到/dev/tty0的連結(而tty0又指當前虛擬控制檯,即atl+Fn切換到哪);
即console -> tty0 -> ttyn;
/dev/console的指向可以改變,取決於系統配置,指向tty0,ttyn,或序列裝置;
-
現在(Linux 2.1.71開始)
/dev/console仍然預設對映到/dev/tty0;
但已完全由核心管理,控制它的對映;
如果一個終端裝置要實現console功能,必須在單使用者模式才能登入console,才可以向核心註冊一個struct console結構(核心命令console=);
Ubuntu 18.04基於Linux核心v4.15,屬於後一種,現在的情況
控制終端、tty0、console都是指向,但指向的範圍和順序不同
shell
1. 什麼是Shell
Shell,殼,與Linux的核kernel對應。顧名思義就是機器的核心外面的一層殼,用於人機互動,只要是人與電腦之間互動的介面,就可以稱為 Shell;
Shell=直譯器,那解釋什麼呢?
- 互動式:等待你的命令,執行你提交的命令(不止是命令列下的鍵盤輸入,還有圖形介面下的滑鼠輸入)
- 非互動式:不與你互動,直接讀取放在檔案中的命令並執行,這種放在檔案中的命令,也被叫做指令碼
誤解1:常見的對Shell 這個概念的誤解,認為一定要是命令列的 Shell 才叫 Shell。其實 ,我們熟悉的 GNOME、KDE 等圖形介面也都是 Shell,只不過是 GUI(圖形化) Shell。
誤解2:混同Shell與CLI(命令提示符),儘管指的是命令列下的Shell,這也是錯的。對於命令列下的Shell,CLI命令提示符是Shell的核心,也是Shell負責互動的那一部分,但不是Shell的全部。對於圖形化的Shell,這一負責互動的部分,當然由GUI,圖形介面來取代了。
GUI和CLI都是shell,shell既不屬於系統核心,也與一般應用程式不同,它屬於系統工具,可以算作作業系統的一部分,主要用來管理檔案和執行程式,並提供與使用者的互動。
使用者>(<)Shell>(<) 作業系統核心
2. Shell有哪些
-
Windows 9X下:
核是DOS,圖形化的殼叫Windows Explorer,命令列的殼叫command
-
Linux下:
核是Linux核心
命令列的殼有bash(Linux一般預設) 、sh 、csh 、ksh......
圖形化的殼有KDE、GNOME、CDE、 XFCE......
3. Shell與tty的關係
- tty是與計算機的輸入輸出相關的
- Shell是與核心相關的
也即你向終端輸入命令(或GUI下點選滑鼠),終端自己是不會解釋這些命令的,它只負責輸入輸出,而計算機是大爺,它只認二進位制,不認你的命令。真正把這些命令解釋成計算機明白的語言的是shell;
shell把一些資訊適當的輸送到終端裝置,也接收來自終端裝置的輸入;
你每開啟一個終端,都會啟動一個shell程序與之關聯
在除了GUI佔用的控制檯終端以外的字元啞終端上:shell程序在使用者登陸之後才啟動
shell程序也可以沒有終端與之關聯
對前面內容的實驗
在Ubuntu 18.04LST上進行
“在Ubuntu 18.04中,他們已經改變了一些東西,你無法訪問tty1,它總是顯示登入螢幕。如果您已登入,則無法訪問tty2,因為它將成為第一個登入使用者的GUI。在tty7上顯示的兩個GUI的傳統已經結束。”
ofollow,noindex">https://askubuntu.com/questions/1033206/switch-to-console-in-ubuntu-18-04-how-to-leave-gui1. ctrl + alt + T(被圖形化介面佔用的tty2下的偽終端)
輸入tty
輸出/dev/pts/1
echo "hello" > /dev/tty
輸出hello
輸入echo “hello” > /dev/tty0
輸出無
關機見hello
輸入echo “hello”> /dev/console
無
關機見hello
2. ctrl + alt + F3(編號為tty3的虛擬控制檯)
輸入tty
輸出tty3
輸入echo "hello" > /dev/tty
輸出hello
輸入echo “hello” > /dev/tty0
輸出hello
輸入echo “hello”> /dev/console
輸出hello