【问题标题】:Features obligatory for TERM=dumb terminalTERM=哑终端必须具备的功能
【发布时间】:2016-08-17 16:09:27
【问题描述】:

我希望在 中实现一个远程客户端,它通过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终端没有这两个能力,但它仍然期望有什么能力?有没有关于它的规范或一些事实上的标准?

【问题讨论】:

  • 愚蠢就是字面意思。它只会吐出您发送的字符,并且除了回车和输出空格之外没有定位功能。没有“光标”可以移动,因此你不能在其中打印“复杂”的界面,基本上每次发生变化时都打印出整个屏幕。请注意,这不是 bash 抱怨,这是 mc。它需要一个合适的终端。尝试 vt100 或其他东西,而不是愚蠢。
  • @MarcB,哦,我肯定无法实现vt100,我只想检查我的dumb 实现在dumb 终端上是否按预期工作。例如,我注意到当字符打印在最后一行的最后一列时,我在 Linux 上的标准终端不会自动滚动。
  • 它会(仅)在打印一个附加字符以换行到下一行时这样做。

标签: golang linux shell go terminal


【解决方案1】:

您最好的信息来源是 terminfo 条目,可以使用 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,

这表明哑终端非常有限......

【讨论】:

  • 谢谢。现在我只需要破译那个标志.. =)
  • 在现代 linux 上的 man terminfo 中有一个很好的功能列表和一些解释,至少足以解码正在发生的事情。
  • 在网上得到这些解释还是很不错的。
  • 包括-L 不起作用?例如:$ infocmp -L dumb。请问,你说的是什么flag?
【解决方案2】:

寻找源头会有所帮助。终端数据库有 cmets。这是slice from that

#### 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”具有自动边距(文本“换行”在右边距),假定有 80 列,以及 ASCII BEL 和回车。由于缺少更好的东西,cud1(光标向下)是一个 ASCII 换行符。 ind(索引)值相同,这意味着当您到达屏幕底部时,文本会向上滚动。

    没有游标寻址 (cup) 也没有替代(例如沿行或列任意移动)。

  • “unknown”添加了“generic”标志,将其标记为不适合curses应用程序使用。把它想象成一台打印机。

至于最低要求,这实际上取决于个人应用程序。 ncurses 可以在没有cup 的情况下设法在屏幕上移动。它适用于六种策略。如果您阅读mvcur 的源代码,您可以了解它需要什么。

但是,诸如mc 之类的应用程序并不仅仅依靠 ncurses 来决定它是否有效,因为(在这种情况下)它可能与俚语相关联(它并没有仔细检查)。所以mc 会进行自己的检查,这可能会增加限制。

实际上,除非您选择“哑”等有限的终端描述,否则您可能遇到的大多数终端都可以工作。

进一步阅读:

【讨论】:

  • 那么,^G 是字节 0x07,这意味着我的客户端在收到一个时应该发出哔哔声?而^M是0x0D,也就是\r,而^J实际上是\n,所以当远程发送0x0D时,我的客户端应该让光标回到行首。
  • 是的 - 但是:回车可能(通常是)由终端驱动程序(不是终端本身)翻译成^M^J。终端描述只说明终端可以做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2014-01-04
  • 2022-06-13
  • 1970-01-01
相关资源
最近更新 更多