没有$ TERM的值,也没有指定-T


22

我最近升级apt-get dist-upgrade了Kubuntu和Lubuntu Linux机器,并在每次登录其中一台机器时收到以下消息:

tput: No value for $TERM and no -T specified

这是确切消息的屏幕截图: tput:没有$ TERM的值,也没有指定-T

这在我的Lubuntu机器和Kubuntu机器上都发生过,直到我升级后才成为问题。所以我怀疑这不是用户错误。

我怎样才能解决这个问题?

更新

我已将其跟踪到我的.bashrc文件,该文件已由我的.profile文件调用。但是,我的.bashrc文件现在在我进行GUI登录时运行,而在升级之前却没有运行,这一事实有点奇怪。不,我最近还没有修改.bashrc文件或.profile。另外,bash不是我的默认外壳。

问题是我tput在.bashrc文件中调用以设置变量,以在提示中添加颜色。但是在我的.bashrc文件现在运行的(不合适的)时间,$TERM未设置。

fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)

更新的问题:我该如何解决?我应该设定$TERM自己吗?还是如果没有设置我应该不设置这些变量$TERM

更新2

我尝试的一种解决方案是检查是否$TERM已设置。但这似乎不起作用。我仍然收到相同的错误消息。这是代码:

if [ ! "$TERM" = "" ]; then
  #Do stuff here
fi

如此看来$TERM 定下来,但tput仍得出结论并非如此。


1
如果我没记错的话.profile,不管默认的shell是什么,都可以运行
Sergiy Kolodyazhnyy

@Serg但在GUI Shell登录期间?另外,我并不总是看到这个问题。
Sildoreth

好吧,是的,应该在用户登录后运行,这正是您在做什么
Sergiy Kolodyazhnyy 2015年

Answers:


13

最终对我有用的是检查外壳是否是交互式外壳。我基于unix.stackexchange上的另一篇文章的解决方案:如何检查shell是否为login / interactive / batch

因此,该解决方案的代码为:

if [[ $- == *i* ]]; then
  fgRed=$(tput setaf 1)     ; fgGreen=$(tput setaf 2)  ; fgBlue=$(tput setaf 4)
  fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
  fgWhite=$(tput setaf 7)   ; fgBlack=$(tput setaf 0)
  bgRed=$(tput setab 1)     ; bgGreen=$(tput setab 2)  ; bgBlue=$(tput setab 4)
  bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
  bgWhite=$(tput setab 7)   ; bgBlack=$(tput setab 0)
fi

啊哈,这是一个优雅的解决方案。:)
Gunnar Hjalmarsson 2015年

2
如果在.bashrc,我会感到惊讶。默认值.bashrc包含:# If not running interactively, don't do anything case $- in *i*) ;; *) return;;,因此除非进行交互,否则不应应用您的设置。
muru

@muru我的.bashrc文件是非默认的。:)
Sildoreth

但是你在哪里做的?在.bashrc
jjmerelo

我认为,如果您将此文件放在文件的顶部,它会更干净:[[ $- == *i* ]] || returnRef:(askubuntu.com/a/1070182/362122
Klik

9

如果你这样做

if tty -s
then
    : # your tput commands
fi

它将解决您的问题。如果没有-s选项,则tty将显示您的tty或写为“ not tty”


tty手册页上的描述是“打印连接到标准输入的终端的文件名”。如果脚本的stdin是管道,则此测试将失败,结果是程序仅由于其输入来自管道而停止在其输出中打印颜色。也许(用英语:“ stdout是否已连接到终端?”)是您真正想要的吗?这样,当输出将输出到终端时,您才能获得颜色;如果将其输出重定向到文件或通过管道将其输出,则不会看到奇怪的终端代码。test -t 1less
TheDudeAbides

6

对我来说

export TERM=xterm

/etc/profile是解决问题的唯一的事情。实际上,错误提示了我们:No value for $TERM


4

[ 不同的情况,但是搜索引擎首先把我引到了这里]

当在Docker容器中发生“ tput:$ TERM没有值且没有指定-T ”错误时(对我来说,打开zsh shell调用时(-i用于交互)),解决此问题的唯一方法是设置变量就像该镜像的Dockerfile中一样。docker exec -it <container> zshENV TERM xterm-256color

方法,如RUN export TERM=xterm-256color 还是RUN echo "export TERM=xterm-256color" >> ~/.zshrc没有成功。TERM的其他值也是可能的。


3

尝试打开终端(无关紧要,即使是tty1也可以)并运行此行

sudo update-alternatives --config x-terminal-emulator

您将看到x窗口的默认终端仿真器的选择。通过选择数字来选择一个,完成后重启。

$ sudo update-alternatives --config x-terminal-emulator替代x-terminal-emulator
有6个选择(提供/ usr / bin / x-terminal-emulator)。

  Selection    Path                             Priority   Status
------------------------------------------------------------
  0            /usr/bin/gnome-terminal.wrapper   40        auto mode
  1            /usr/bin/gnome-terminal.wrapper   40        manual mode
  2            /usr/bin/koi8rxterm               20        manual mode
* 3            /usr/bin/lxterm                   30        manual mode
  4            /usr/bin/sakura                   40        manual mode
  5            /usr/bin/uxterm                   20        manual mode
  6            /usr/bin/xterm                    20        manual mode

Press enter to keep the current choice[*], or type selection number:  

当我尝试此操作时,它告诉我“链接组x-terminal-emulator [...]中只有一种选择。” 这是在我的Kubuntu机器上。
Sildoreth

尝试安装另一个终端仿真器,例如,gnome-terminalsakura
Sergiy Kolodyazhnyy 2015年

我有完全一样的问题。我选择了sakura。但是,这似乎是gnome终端包装的问题。如果是这样,为什么不解决呢?
jjmerelo

实际上,它不能解决问题。
jjmerelo

2
@jjmerelo正如OP稍后在他的答案中透露的那样,他的.bashrc文件中有行,给出错误。侏儒终端包装应该不是问题。我最初的猜测是未设置$ TERM变量,这是他的答案中提到的另一个用户Gunnar。
Sergiy Kolodyazhnyy 2015年

1

错误对话框是由于错误#678421引起的,所以这是我的错。;)它会告诉您有关一个配置文件中某些命令的错误。如果滚动到顶部,则可以查看引起错误消息的文件。

Serg的回答可能足以消除警告对话框。

编辑:

由于已更新的问题,想添加一些内容。

与以前不同,/usr/sbin/lightdm-session现在在bash下运行(以前是sh)。这就是为什么其采购~/.profile结果会导致~/.profile采购~/.bashrc。可能这意味着~/.profile应更改默认内容。

如您所建议,解决该问题的最简单方法是仅在设置了$ TERM的情况下才调用tput。


我尝试检查是否设置了$ TERM,但是它似乎没有用。
Sildoreth

@Sildoreth:能否请您告诉我们这样做的确切代码?(请再次编辑您的问题。)
Gunnar Hjalmarsson

问题添加
Sildoreth

@Sildoreth:看到了。可能是因为在子流程中调用了tput。(只是一个猜测。)无论如何,您找到了一种处理它的好方法。
Gunnar Hjalmarsson 2015年
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.