我希望在golang中实现一个远程客户端,它通过nc
连接到Linux并启动bash
。所以我需要告诉bash
我可以从它发送给我的stdout
中解析哪些特征,以及我将如何将键码和其他东西发送给它的stdin
,以便它也可以解析它们。
这是用TERM=something
环境变量完成的,我需要将其设置为一些值。如果我不设置它,那么各种程序开始抱怨:
$ mc
The TERM environment variable is unset!
我发现我可以将TERM设置为dumb
来表示我的客户端确实有限。但我似乎还是错过了什么。
$ export TERM=dumb
$ mc
Your terminal lacks the ability to clear the screen or position the cursor.
从这里看起来dumb
终端没有这两个功能,但是它仍然期望有什么功能?有关于它的规范或实际标准吗?
找到源头会有帮助。终端数据库有注释。下面是其中的一个片段:
#### Specials
#
# Special "terminals". These are used to label tty lines when you don't
# know what kind of terminal is on it. The characteristics of an unknown
# terminal are the lowest common denominator - they look about like a ti 700.
#
dumb|80-column dumb tty,
am,
cols#80,
bel=^G, cr=^M, cud1=^J, ind=^J,
unknown|unknown terminal type,
gn, use=dumb,
"dumb"one_answers";unknown"假设终端类型,但很少使用:
"dumb"具有自边框(text "wrap ")),假定它有80列,一个ASCII BEL和回车。由于没有更好的选择,
cud1
(光标向下)是一个ASCII换行符。ind
(索引)值是相同的,这意味着当您到达屏幕底部时,文本向上滚动。没有游标寻址(
cup
),也没有替代(例如任意移动一行或列)。"unknown"添加"通用"标志,它将其标记为不适合由诅咒应用程序使用。把它想象成一台打印机。
cup
的情况下在屏幕上移动。它有六种策略。如果您阅读mvcur
的源代码,您可以了解它需要什么。
然而,像mc
这样的应用程序并不是简单地依赖于护士来决定它是否工作,因为(在这种情况下)它可能与俚语联系在一起(后者不会密切检查)。所以mc
自己检查,这可能会增加限制。
在实践中,除非您选择了一个有限的终端描述,如"dumb",否则您可能遇到的大多数终端都可以工作。
进一步阅读:
- 终端间能力数据库
- 诅咒到数据库终端的接口(包括
mvcur
) - ncurses/电传/lib_mvcur.c
您最好的信息来源将是终端条目,可以很容易地使用infocmp工具查看:
infocmp dumb
# Reconstructed via infocmp from file: /lib/terminfo/d/dumb
dumb|80-column dumb tty,
am,
cols#80,
bel=^G, cr=^M, cud1=^J, ind=^J,