我可以安全地设置 TERM 环境变量吗?

Posted

技术标签:

【中文标题】我可以安全地设置 TERM 环境变量吗?【英文标题】:May I set TERM environment variable safely? 【发布时间】: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 【参考方案1】:

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

类似这样的:

eval `tset -s vt100`

在 shell 初始化中会起作用。

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

进一步阅读:

tset, reset -- terminal initialization (FreeBSD) tset, reset - terminal initialization (ncurses) tset, reset - terminal initialization (NetBSD)

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于我可以安全地设置 TERM 环境变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE环境变量定义

我可以在 Bash 的命令行上设置环境变量吗?

安装eclipse后需要 设置环境变量吗??

Capistrano:我可以为整个 cap 会话设置一个环境变量吗?

请问linux 中如何设置环境变量?在哪个文件下可以查看该环境变量。

Firebase Auth我的变量安全/安全吗?