Command-Line

終端使用什麼協議/標準?

  • October 22, 2017

我想知道命令行應用程序的“GUI”如何通過網路進行通信。大多數時候,它很簡單(純文字/輸入),但有時它更複雜(能力)。

它是否由某種標准定義,以便任何人都可以編寫自己的終端並且所有終端實現的行為方式相同(顏色、定位等)?

控制台程序通常使用curses或其後繼者之一¹來建構您正在談論的那種文本使用者界面。

這些使用兩個數據庫之一,稱為termcapterminfo。² 這些數據庫包含地圖,告訴庫發送哪些程式碼以使用大量不同的終端類型獲得所需的操作。您會發現在這些數據庫中定義的絕大多數終端類型都無法在真正的終端時代存活下來,因此現在僅具有歷史意義。

ANSI 端子

現代 Unix 終端仿真器³使用 ANSI X3.64 協議或其後來的變體之一:

  • ANSI X3.64:控制“玻璃終端”的標準——與電傳打字機相反——它基於遠端終端解釋的特殊字元序列。例如,如果 Unix 機器想要告訴 ANSI X3.64 兼容終端將其游標移動到螢幕的左上角,它會發送字元ESC [ 1 ; 1 H. 前兩個字元告訴終端期待一個控制序列,1 是行和列,H是命令,意思是“移動游標”。⁴

瑣事:許多 PC BBS 也使用 ANSI 程式碼。(實際上仍然如此。)

  • DEC VT100:第一個真正流行的 ANSI 兼容玻璃終端是 Digital Equipment Corporation 的 VT100。通過在市場上證明 ANSI 的法律標準,它建立了一個在今天仍然很重要的事實上的標準。

有時您會看到這稱為 VT102 協議,它是 VT100 的後期成本降低(因此更受歡迎)版本以及內置的所有可用擴展選項。

DEC 終端協議是一個向後兼容的系列,從 1978 年推出的第一個 ANSI 兼容型號(VT100)一直延伸到Boundless Technologies在 1995 年從 DEC 收購終端業務後生產的 VT500 系列型號。(Boundless 是現在倒閉了,但他們的終端仍然不時出現在二手市場上。)

  • xterm : ANSI 和 VT-whatever 標準的一種混合體。每當您使用類似 GUI 終端仿真器xterm或其衍生產品之一時,您通常也會使用xterm終端協議,通常是更現代的xterm-colorxterm-color256變體。
  • Linux:Linux 控制台也使用 ANSI 終端協議的擴展變體,與協議的精神相同xterm。它的大部分擴展都與 PC 和玻璃終端之間的差異有關。例如,IBM 鍵盤有一些鍵不在 DEC VT 上——無論如何。(反之亦然。)

一些 Unix 系統也有自己的控制台終端協議。scoansi例如,SCO Unix的ANSI X3.64 變體。

典型的終端仿真器程序有點像雜種,並不能準確地模擬任何單個終端模型。它可能支持 VT320 之前 96% 的所有 DEC VT 轉義序列,但也支持 ANSI 顏色(VT525 功能)等擴展以及任意數量的行和列。如果您的程序不需要這些功能,即使您告訴curses(或其他)您希望使用它的程序使用 VT320 協議,也不會錯過它不理解的 4% 程式碼。這樣的程序可能會宣傳自己與 VT320 兼容,然後,即使嚴格來說,它不是。⁵

非 ANSI 端子

您有時還會遇到其他一些值得注意的標準:

  • Wyse:最早的玻璃終端獨立生產商之一,Wyse 在 1980 年代初期開始製造終端,當時工作站計算開始取代小型電腦。儘管 Wyse 終端能夠模擬 VT100 和其他流行的終端協議,但它們也有自己的本地程式碼。
  • IBM 3270:雖然這不是嚴格意義上的“Unix”終端類型,但將 Unix 系統連接到 IBM 大型機的需要導致了 IBM 3270 系列終端仿真程序的創建,您仍然可以在使用中找到它。後來的IBM 5250 系列終端的仿真器也相當普遍,現在最常用於連接到AS/400 和 System i小型電腦。
  • Tektronix 4014:在 PC 和工作站大量取代玻璃終端並因此使點陣圖圖形成為標準功能之前,有昂貴的圖形終端在螢幕上繪製圖形以響應類似於上述轉義序列的文本命令。其中最受歡迎的可能是泰克 4010 系列。

它們使用起來非常有趣。您可以編寫一個繪製圖形的程序,但是您可以將其輸出重定向到一個文件,而不是簡單地執行它以在本地終端上繪製:

$ ./my4014program > my-neat-graphic

然後,您可以將該文件發送給其他人,他們可以cat在他們的 Tek 終端上查看圖形,而無需您的程序。部分魅力在於這些終端的繪圖速度有多慢,因此您可以在幾秒鐘內看到圖形的堆積。

當今使用 Unix 終端仿真

curses您可以通過查看TERM環境變數找出您要求庫喜歡使用的終端標準:

$ echo $TERM
xterm-color

當你ssh到另一個系統時,這個TERM變數會被攜帶,所以遠端 Unix 機器知道如何與你的本地終端通信。

因為這些協議中有很多是 ANSI X3.64 變體,並且因為無處不在的 ASCII 和 UTF-8 字元編碼標準處理了很多其他問題,所以不正確的TERM變數通常不會造成災難性的後果。容易出錯的是擴展鍵,如 Home 和 Page Up、Alt-whatever 組合鍵,以及顏色、粗體等印刷顯示功能。


腳註:

  1. 最常見的是ncurses

API也有直接的競爭對手curses,例如S-Lang。 2. AT&Tterminfo作為 BSDtermcap數據庫的替代品發布,並且在很大程度上成功地替代了它,但仍有一些程序仍在使用舊termcap數據庫。這是您在現代系統上仍然可以找到的眾多 BSD 與 AT&T 差異之一。

我的 macOS 機器沒有/etc/termcap,但確實有/usr/share/terminfo,而標準安裝的 FreeBSD 則相反,儘管這兩個作業系統在命令行級別通常非常相似。 3. minicom, xterm, mintty, GNOME 終端, Terminal.app等。 4. 正確編寫的 Unix 程序不會直接發出這些轉義序列。相反,他們使用上面提到的庫之一,告訴它“將游標移動到位置 (1,1)”或其他任何內容,並且該會根據您的TERM環境變數設置發出必要的終端控制程式碼。無論您在哪種終端類型上執行程序,這都允許程序正常工作。 5. 舊的文本終端有很多奇怪的功能並沒有被程序大量使用,所以許多流行的終端仿真器程序根本沒有實現這些功能。常見的遺漏是對Sixel 圖形和雙寬/雙高文本模式的支持。

的維護者xterm編寫了一個程序vttest,用於測試 VT 終端仿真器,例如xterm. 您可以針對其他終端仿真器執行它以找出它們不支持的功能。

引用自:https://unix.stackexchange.com/questions/5800