TERM环境变量默认值在哪里设置?

安迪·富斯尼亚克(Andy Fusniak)

当我在桌面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)。

JdeBP

在很多地方,取决于

在虚拟终端和真实终端上,TERM环境变量是由链接到的程序设置的login,并一直继承到交互式外壳程序,该交互式外壳程序一旦登录便会执行。确切地说,发生这种情况的位置因系统而异,并取决于终端的类型。

真实终端

实际,串行终端的类型可能会有所不同,具体取决于电线另一端的情况。因此,通常getty使用指定终端类型的参数来调用程序,或者TERM从服务管理器的服务配置数据中将程序传递给该程序。

  • 在van Smoorenburginit系统上,您可以在/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
  • 在BSD上,init/etc/ttys数据库中每个终端条目的第三个字段中获取终端类型并在执行该终端TERM的环境中从中进行设置getty/etc/ttys更改BSD上实际终端的终端类型的地方也是如此

systemd的可变性

所述[email protected]服务单元文件,或插入式适用于此的文件,是在哪里改变终端类型上systemd系统真实终端。请注意,此更改适用于所有使用此服务单元模板的终端登录服务。(要仅对单个终端进行更改,必须手动实例化模板,或添加仅适用于实例化的插件。)

systemd在其生命周期中至少具有四种机制来获取TERM环境变量的值可以看出,在首次编写此答案时,模板服务单元文件中一行。在其他时候,将类型分别硬连接到服务单元文件中。最近,环境变量已从进程#1继承,该进程已通过各种方式进行了设置。Environment=TERM=somethinglinuxvt102gettyserial-getty

截至2020年,systemd决定在服务的TERM环境变量中指定哪种终端类型的方法非常复杂,根本没有记录在案。更改方式仍然是带有的嵌入式配置文件但是默认值的来源是相当可变的。在涉及涉及各个服务单元设置的规则的解释相当复杂的前提下,它可以是以下三个值之一:硬连线,硬连线(不再)或进程#1继承环境变量的值,通常从内核/引导加载程序。Environment=TERM=somethingTTYPath=linuxvt220vt102TERM

(具有讽刺意味的是,该getttyent()机制仍然存在于GNU C库中,而systemd可能会重用该/etc/ttys机制。)

内核虚拟终端

如前所述,内核虚拟终端具有固定类型。与NetBSD可以动态更改内核虚拟终端类型不同,Linux和其他BSD具有在内核的内置终端仿真程序中实现的单个固定终端类型。在Linux上,该类型与linuxterminfo数据库中的类型匹配(自从版本9开始,FreeBSD的内核终端仿真teken。在版本9之前,它是cons25OpenBSD的pccon。)

  • 在使用mingettyvc-get-tty(从nosh软件包中)的系统上,程序“知道”它只能与虚拟终端通信,并且他们硬连接适合于该程序所编译的操作系统的“已知”虚拟终端类型。
  • 在系统系统上,以前可以在/usr/lib/systemd/system/[email protected]单位文件中看到此信息/lib/systemd/system/[email protected]在未合并的系统上),该文件可以读取

    环境= TERM = Linux
    TERM在传递给的环境中设置变量agetty

对于内核虚拟终端,不会更改终端类型。毕竟,内核中的终端仿真器程序不会更改。更改类型不正确的。特别是,这会搞乱光标/编辑键CSI序列识别。linuxLinux内核终端仿真器发送CSI序列是不同的xtermvt100通过GUI终端仿真器程序在DEC VT模式发送CSI序列。(实际上,它们是高度特有的和非标准的,并且与我所知道的所有真实终端以及几乎所有其他软件终端仿真器(除了内置于Linux的仿真器)都不同。)

GUI终端模拟器

从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

进一步阅读

  • 乔纳森·德·博伊恩·波拉德(Jonathan de Boyne Pollard,2018)。TERMnosh指南软件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章