当我在桌面GUI中使用GNOME终端仿真器打开终端窗口时,shell TERM环境变量默认为值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 Terminal仿真器外壳中,如果我键入
export TERM=xterm-color
source /.bashrc
两个壳都更改为颜色模式(我想总是在两个壳中都发生这种情况)。
请在哪里TERM
设置默认值,如果可能的话,在哪里更改默认值的最佳位置是哪里?终端仿真器GUI中似乎没有任何东西可以选择或设置默认的TERM值。
我确实考虑过仅将行添加export TERM=xterm-color
到~/.bashrc
文件的顶部,但是我的直觉告诉我这不是最好的解决方案,而且我的Google搜索还没有给我一个很好的答案。
我正在运行Ubuntu 15.04桌面版(基于Debian)。
在虚拟终端和真实终端上,TERM
环境变量是由链接到的程序设置的login
,并一直继承到交互式外壳程序,该交互式外壳程序一旦登录便会执行。确切地说,发生这种情况的位置因系统而异,并取决于终端的类型。
实际,串行终端的类型可能会有所不同,具体取决于电线另一端的情况。因此,通常getty
使用指定终端类型的参数来调用程序,或者TERM
从服务管理器的服务配置数据中将程序传递给该程序。
init
系统上,您可以在/etc/inittab
条目中看到此内容,这些条目将按照S0:3:重生:/ sbin / agetty ttyS0 9600 vt100-nav的最后一个参数
agetty
在该行,vt100-nav
是用于终端类型组/dev/ttyS0
。所以/etc/inittab
是在哪里改变终端类型用于在这样的系统真实终端。/usr/lib/systemd/system/[email protected]
单位文件中看到此信息(/lib/systemd/system/[email protected]
在未合并的系统上),该文件用于读取环境= TERM = vt100
TERM
在传递给的环境中设置变量agetty
。init
从/etc/ttys
数据库中每个终端条目的第三个字段中获取终端类型,并在执行该终端TERM
的环境中从中进行设置getty
。/etc/ttys
更改BSD上实际终端的终端类型的地方也是如此。所述[email protected]
服务单元文件,或插入式适用于此的文件,是在哪里改变终端类型上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上,该类型与linux
terminfo数据库中的类型匹配。(自从版本9开始,FreeBSD的内核终端仿真teken
。在版本9之前,它是cons25
OpenBSD的pccon
。)
mingetty
或vc-get-tty
(从nosh软件包中)的系统上,程序“知道”它只能与虚拟终端通信,并且他们硬连接适合于该程序所编译的操作系统的“已知”虚拟终端类型。/usr/lib/systemd/system/[email protected]
单位文件中看到此信息(/lib/systemd/system/[email protected]
在未合并的系统上),该文件可以读取环境= TERM = Linux
TERM
在传递给的环境中设置变量agetty
。对于内核虚拟终端,不会更改终端类型。毕竟,内核中的终端仿真器程序不会更改。更改类型是不正确的。特别是,这会搞乱光标/编辑键CSI序列识别。的linux
Linux内核终端仿真器发送CSI序列是不同的xterm
或vt100
通过GUI终端仿真器程序在DEC VT模式发送CSI序列。(实际上,它们是高度特有的和非标准的,并且与我所知道的所有真实终端以及几乎所有其他软件终端仿真器(除了内置于Linux的仿真器)都不同。)
从SSHdæmon到screen
,您的GUI终端仿真器是使用伪终端的众多程序之一。终端类型是什么,取决于在伪终端的主端上运行的终端仿真器程序以及它的配置方式。大多数GUI终端仿真器将在从属端启动一个程序,该TERM
变量的值与其在主端的终端仿真相匹配。像SSH服务器这样的程序将尝试“通过”连接客户端上的终端类型。通常,在终端仿真中有一些菜单或配置选项可供选择。
检测颜色功能的正确方法是不要硬连接脚本中的终端类型列表。有很多支持颜色的终端类型。
正确的方法是查看termcap / terminfo关于您的终端类型的内容。
颜色= 0 如果tput Co> / dev / null 2>&1 然后 测试“`tput Co`” -gt 2 && colour = 1 elif tput颜色> / dev / null 2>&1 然后 测试“`tput colors`” -gt 2 && colour = 1 是
TERM
。nosh指南。软件。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句