如果終端仿真器和在其中執行的 Shell 使用不同的 TERM 類型,可能會發生什麼“壞”事情(以及為什麼)?
例如,在 PuTTY 的配置中,我將終端類型設置為,
xterm-256color
但在 SSH 登錄後,我export TERM=linux
在 shell 中將其更改為。我知道它在大多數時候都很好用。只是想從技術角度了解(PuTTY 和遠端 Shell 之間的)不一致實際上意味著什麼。
該
TERM
變數用於查找終端/仿真器的功能以及發送終端控制功能(如更改顏色、移動游標或清除螢幕)的正確程式碼。理論上,變數標識的終端類型
TERM
將準確地由位於/usr/share/terminfo/
目錄樹中的終端類型描述來描述。在實踐中,終端仿真器可能存在導致其行為偏離類型規範的錯誤。(終端類型規範本身也可能包含錯誤,但這是非常古老的技術,大部分錯誤都是很久以前解決的。)
打個比方,終端會說自己的母語;應用程序通常不直接說它,而是使用terminfo數據庫作為一組字典/片語來與終端通信。TERM 環境變數將確定要使用的字典/片語手冊。
如果 TERM 值只是稍微錯誤,即表示終端類型不完全正確但足夠相似,那麼事情可能大部分都可以工作,也許只是功能減少,比如只有 16 種顏色可用而不是 256 種,正如 berndbausch 在問題評論中所說.
如果程序嘗試使用您的實際終端類型中不存在的功能,您可能會在螢幕上看到一些亂碼。如果錯誤是另一種方式(即終端類型描述不包括您的終端實際具有的功能),那麼程序將表現得好像您的終端沒有該功能可用。
但是如果 TERM 值完全錯誤(表示完全不相關的終端類型),那麼諸如清除螢幕和其他基本功能之類的功能將不可用,並且任何嘗試使用它們很可能會在您的螢幕上產生亂碼,因為程序正在以終端仿真器實際上無法辨識的格式發送終端控制程式碼。
ex
在這種狀態下,在更正 TERM 值之前,使案例如普通的文本編輯器(而不是像 classic或等老式的面向行的編輯器ed
)將非常困難或不可能。如果 TERM 值完全失去,大多數需要它的程序將假定預設值
dumb
:一個非常古老的終端,其功能極其有限,甚至可能有列印機而不是螢幕。在這種情況下,您不會得到亂碼,但就像使用完全不正確的 TERM 設置,使用正常文本編輯器或任何產生基於文本的全屏顯示(下拉或彈出菜單)例如,在現有視圖之上)在終端視窗上是不可能的。有關使用非常舊的終端的範例,請參閱 YouTube 上 CuriousMarc 的影片: https ://youtu.be/2XLZ4Z8LpEE?t=501
請注意,在影片中,實際上有一個特定的 TERM 值
tty33
在 Linux 中很容易獲得,儘管 CuriousMarcagetty
為他設置了它,而不是直接分配TERM
變數。dumb
價值可能比這更簡單!由於這種 TERM 類型的東西旨在涵蓋許多不一定具有任何可用作類型檢測機制的舊技術,因此最初根本沒有提供終端類型自動檢測的規定。
對於硬連線串列終端,系統管理員應該在
getty
為連接到新終端的每個串列埠添加程序時配置正確的終端類型。對於調製解調器線路,系統可能被配置為詢問使用者正確的終端類型/etc/profile
或類似類型,除非檢測到會話是非互動式會話。終端類型自動檢測有一些發展,但這些發展並非在所有情況下都可靠(因為有太多不同的舊終端類型),因此自動檢測仍然是一個可選功能,如果管理員認為它是可以啟用的對他們來說值得。
後來,在開發基於網路協議的遠端訪問方法時,添加的功能之一是能夠在連接時自動將一些額外的資訊從客戶端傳遞到遠端主機,TERM 值可能是其中的第一個。“而且非常高興。”