Bash

TERM 環境變數預設值在哪裡設置?

  • March 23, 2022

當我在桌面 GUI 中使用 GNOME 終端模擬器打開終端視窗時,shell TERM 環境變數預設為 value xterm

如果我使用CTL++ALT切換F1到控制台 TTY 視窗並且echo $TERM值設置為linux.

我詢問的動機是在我的~/.bashrc文件中使用一個變數來確定是否提供了彩色外殼或只是提供了良好的老式單色。

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
   xterm-color) color_prompt=yes;;
esac

如果我鍵入,則在控制台外殼和 Gnome 終端仿真器外殼中

export TERM=xterm-color
source /.bashrc

兩個外殼都更改為顏色模式(我希望兩者都發生)。

如果可能的話,請在哪裡設置預設TERM值以及更改預設值的最佳位置在哪裡?終端仿真器 GUI 中似乎沒有任何內容可供選擇或設置預設 TERM 值。

我確實考慮過將這一行添加export TERM=xterm-color到我的文件頂部,~/.bashrc但我的直覺告訴這不是最好的解決方案,而且我的Google搜尋還沒有讓我得到一個好的答案。

我正在執行 Ubuntu 15.04 桌面版(基於 Debian)。

在很多地方,視情況而定

在虛擬終端和真實終端上,TERM環境變數由連結到 的程序設置login,並一直繼承到登錄後執行的互動式 shell。確切地說,發生這種情況的位置因係統而異,也因終端類型而異。

真實終端

真實的串列終端的類型可能會有所不同,具體取決於電線另一端的情況。因此,通常getty使用指定終端類型的參數呼叫程序,或者TERM從服務管理器的服務配置數據中傳遞程序。

  • 在 van Smoorenburginit系統上,人們可以在/etc/inittab條目中看到這一點,它會讀到類似以下內容的內容
S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav

agetty該行中的最後一個參數vt100-nav, 是為 設置的終端類型/dev/ttyS0/etc/inittab在此類系統上更改真實終端的終端類型也是如此。

  • 在 systemd 系統上,過去可以在/usr/lib/systemd/system/serial-getty@.service單元文件中看到這一點(/lib/systemd/system/serial-getty@.service在未合併的系統上),該文件用於讀取
環境=TERM=vt100

TERM在傳遞給的環境中設置變數agetty

  • 在 BSD 上,從數據庫init中每個終端條目的第三個欄位中獲取終端類型,並從它執行的環境中設置。更改 BSD 上真實終端的終端類型也是如此。/etc/ttys``TERM``getty``/etc/ttys

systemd 的可變性

服務單元文件或適用於它的serial-getty@.service插入文件是在 systemd 系統上更改真實終端的終端類型的地方。請注意,此類更改適用於使用此服務單元模板的所有終端登錄服務。(要僅為單個終端更改它,必須手動實例化模板,或添加僅適用於實例化的外掛。)

systemd 在其生命週期中至少有四種機制來獲取TERM環境變數的值。在第一次寫這個答案的時候,可以看出,模板服務單元文件中有一行。在其他時候,類型和分別被硬連接到和服務單元文件中。最近,環境變數已從程序#1 繼承,該程序以各種方式對其進行了設置。Environment=TERM=*something*``linux``vt102``getty``serial-getty

截至 2020 年,systemd 決定在服務的TERM環境變數中指定哪種終端類型的方式非常複雜,並且根本沒有記錄。更改它的方法仍然是一個帶有. 但是預設值的來源是非常可變的。根據一些相當複雜的解釋規則,涉及到各個服務單元的設置,它可以是三個值之一:硬連線、硬連線(不再)或程序#1 繼承的環境變數的值,通常來自核心/引導載入程序。Environment=TERM=*something*``TTYPath=``linux``vt220``vt102``TERM

(具有諷刺意味的是,該getttyent()機制仍然存在於 GNU C 庫中,並且 systemd 可以重用該/etc/ttys機制。)

核心虛擬終端

正如您所指出的,核心虛擬終端具有固定類型。與 NetBSD 不同,它可以動態改變核心虛擬終端類型,Linux 和其他 BSD 在核心的內置終端仿真程序中實現了單一的固定終端類型。在 Linux 上,該類型與linuxterminfo 數據庫匹配。(FreeBSD 從第 9 版開始的核心終端仿真一直是teken. 在第 9 版之前是cons25 OpenBSD 的pccon。)

  • 在使用mingettyvc-get-tty(來自 nosh 包)的系統上,程序“知道”它只能與虛擬終端對話,並且它們硬連線適用於編譯程序的作業系統的“已知”虛擬終端類型。
  • 在 systemd 系統上,過去可以在/usr/lib/systemd/system/getty@.service單元文件中看到這一點(/lib/systemd/system/getty@.service在未合併的系統上),它讀取
環境=TERM=linux

TERM在傳遞給的環境中設置變數agetty

對於核心虛擬終端,改變終端類型。畢竟,核心中的終端模擬器程序並沒有改變。更改類型是*不正確的。*特別是,這將搞砸游標/編輯鍵 CSI 序列辨識。linuxLinux核心終端仿真器發送的CSI序列與DEC VT模式下GUI終端仿真器程序發送的CSI序列xterm不同。vt100(事實上,它們非常獨特且非標準,並且與我所知道的所有真實終端以及幾乎所有其他軟體終端仿真器都不同,除了 Linux 內置的那個。)

GUI終端模擬器

screen您的 GUI 終端仿真器是使用偽終端的眾多程序之一,從 SSH 守護程序到. 終端類型取決於偽終端主機端執行的終端仿真器程序,以及它的配置方式。大多數 GUI 終端仿真器將使用一個變數在從屬端啟動程序,該TERM變數的值與其在主端的終端仿真相匹配。像 SSH 伺服器這樣的程序將嘗試“通過”連接客戶端上的終端類型。通常在終端仿真中有一些菜單或配置選項可供選擇。

緊握的手

檢測顏色功能的正確方法不是在腳本中硬連線終端類型列表。有很多支持顏色的終端類型。

正確的方法是查看 termcap/terminfo 對您的終端類型的描述。

顏色=0
如果 tput Co > /dev/null 2>&1
然後
測試“`tput Co`”-gt 2 && colour=1
elif 輸入顏色 > /dev/null 2>&1
然後
測試“`tput colors`”-gt 2 && colour=1
是

進一步閱讀

  • 喬納森·德博因·波拉德 (2018)。TERM. 小吃指南。軟體。

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