【问题标题】:May I set TERM environment variable safely?我可以安全地设置 TERM 环境变量吗?
【发布时间】:2017-01-23 13:15:10
【问题描述】:

我正在编写一个使用 termcaps 的程序,我需要知道我使用的是哪种终端。
我知道我可以通过getenv("TERM") 获得TERM 变量,但我可以使用“$ env -i ./myprog”启动我的程序,并且不会设置 TERM。

那么如何确定我必须使用哪种终端类型?
我可以在我的应用程序中安全地将TERM 变量设置为xterm/xterm-256color 吗?
它会导致不可移植性问题吗?
有没有一种方法可以安全地执行此操作(获取 termtype)?
我有很多手册(getty - getttab - tty - ttys)和帖子,但我找不到任何解决方案。

我也很担心,因为如果我启动一个 shell(如 zshtcsh),我的某些键会出现问题。

例如像这样启动zsh
$env -i zsh
会导致箭头和任何暗示 termcaps 的键(甚至 Ctr-d)出现问题。
相反,bashtcsh 将在许多键上正常运行,但不是全部。

【问题讨论】:

  • TERM 变量的存在正是为了确定要使用的终端类型,几乎没有其他通用的方法来猜测终端类型并设置 TERM。如果终端未设置,您可以让用户选择终端或尝试默认为vt100,因为这经常使用。
  • 我正在尝试获得一个比可能的应用程序更便携的应用程序,所以我想如果我选择设置为默认 vt100,我有一天会遇到可移植性问题?
  • 不,如果使用的终端仿真与 vt100 不兼容,它将无法按预期工作。可移植的方式是:依赖TERM环境变量的设置;如果没有设置,用户必须修复他的环境
  • 不要破坏你的 TERM 变量。如果您无法抗拒使用env -i,请这样使用:env -i TERM=$TERM bash

标签: c termios termcap


【解决方案1】:

如果您实际使用的是 termcap(而不是一些最小的实现,例如busybox),您可能使用提供tset 的系统,它可以为用户提供TERM 的默认选择,可以修改.

类似这样的:

eval `tset -s vt100`

在 shell 初始化中会起作用。

实际上tset 并不局限于 termcap-systems,但它就是从那里开始的。

进一步阅读:

【讨论】:

    【解决方案2】:

    TERM=vt100 设置为默认值(Ctx 的建议)(在某种程度上)是安全的,因为无论如何大多数终端仿真器都设置为模拟它。不过,我建议您在这种情况下打印警告。

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 2017-10-30
      • 2014-02-10
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 2015-06-18
      • 2013-10-25
      • 2014-06-21
      相关资源
      最近更新 更多