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


26

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


Answers:


17

在很多地方,取决于

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

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

  • 在van Smoorenburg init系统上,您可以在/etc/inittab条目中看到此内容,这些条目将按照

    S0:3:重生:/ sbin / agetty ttyS0 9600 vt100-nav
    的最后一个参数agetty在该行,vt100-nav是用于终端类型组/dev/ttyS0。所以/etc/inittab是在哪里改变终端类型用于在这样的系统真实终端。
  • 在系统系统上,可以在/usr/lib/systemd/system/serial-getty@.service单元文件中看到此信息(/lib/systemd/system/serial-getty@.service在未合并的系统上),该文件显示为

    环境= TERM = vt100
    TERM在传递给的环境中设置变量agetty。在此服务单元文件中,可以更改此类系统上实际终端的终端类型。请注意,它适用于采用此服务单元模板的所有实际终端。(要仅对单个终端进行更改,必须手动实例化模板。)
  • 在BSD上,init/etc/ttys数据库中每个终端条目的第三个字段中获取终端类型,并在执行该终端TERM的环境中从中进行设置getty。所以/etc/ttys是其中一个改变用于在BSD系统实际终端的终端类型。

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

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

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

对于内核虚拟终端,不会更改终端类型。毕竟,内核中的终端仿真器程序不会更改。更改类型是不正确的。特别是,这会搞乱光标/编辑键CSI序列识别。的linuxLinux内核终端仿真器发送CSI序列是不同的xtermvt100通过GUI终端仿真器程序在DEC VT模式发送CSI序列。

您的GUI终端仿真器是从SSHdæmon到screen使用伪终端的众多程序之一。终端类型是什么,取决于在伪终端的主端上运行的终端仿真器程序以及它的配置方式。大多数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
科幻

进一步阅读

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

Debian jessie的默认.bashrc中存在以下内容:[ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes。(
curses

2
tput Co返回Jessie和Xenial中的“未知terminfo功能”。tput colors并且tput setaf 1似乎都工作,虽然我承认我不明白为什么
thom_nic

2

关于我为何认为错误的方法而Ubuntu的方法已过时的详细答案,请参阅/ubuntu//a/614714/398785。我建议您使用(这是gnome-terminal 3.16以来的默认设置,但是可以安全地与较早的gnome-terminals一起使用),并进行相应的调整。TERM=xterm-color.bashrcTERM=xterm-256color.bashrc


1
为您的链接+1。次要建议;以下句子可能令人困惑(我首先给人的印象是您说使用.bashrc已过时)。“ Ubuntu的.bashrc已过时。”
IsaacS

@IsaacS您对如何改善它有任何建议吗?例如,将“过时”替换为“过时”帮助吗?
egmont

1
看来,xterm-256color原因htop搞砸了它的布局像这样在Ubuntu 18.04。
停止Harming Monica

@OrangeDog在哪个终端模拟器中?这个问题在这里,因此我的回答集中在GNOME终端上,而您链接的页面显示了Konsole。该错误看起来好像终端仿真器尚不支持ncurses在那时开始使用的REP转义序列。VTE(GNOME终端)已经在Ubuntu 18.04中添加了对它的支持,很有可能Konsole没有。我怀疑您关于htop破损的评论对Konsole有效,但对GNOME Terminal无效。
egmont

@egmont不能代表最初的问题,但是无论使用WSL的终端,我都能得到相同的结果。
停止Harming Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.