如何检测终端人员使用的是什么

时间:2015-06-10 06:42:45

标签: shell terminal

目前我正在研究一种能够检测人们使用的(伪)终端类型的功能。

我的第一个想法是问/etc/alternatives/x-terminal-emulator

term=/etc/alternatives/x-terminal-emulator
test -e $term && file $term | ...

但我不知道它是否能在OSX上运行良好... 也许有更好的方法来检测它?

有人愿意为我提供更多有关检测终端用户的想法吗?

2 个答案:

答案 0 :(得分:1)

询问终端本身会很好,但是没有可靠,便携的方法。 OP的问题是在Debian或衍生语的上下文中,因为它引用x-terminal-emulator,并询问OSX。

当前的技术水平要求用户设置TERM值,以便终端应用程序(例如ncurses)知道要使用哪个终端描述。许多(可能是“大多数”)应用程序使用termcap或terminfo(或termfo模拟的termcap),但有些应用程序要么硬编码要么使用自己的特殊数据(例如GNU ls)。因此,将TERM设置为可用值有时取决于由于不同原因而独立维护的数据的公分母。

至于为什么它需要用户这样做:

  • 某些应用程序只需将TERM设置为xterm,以便为相应终端的开发人员提供提供准确终端描述的麻烦。
  • xterm常见问题解答 What versions are available? 列出了几个最知名的版本以及来自xterm的差异的一些细节。
  • OSX提供了更多(Terminal.app和iTerm2),它还将TERM设置为xterm,但不同。在ncurses中,这些应用程序中TERM的建议值为nsterm(或nsterm-256color)。
  • 当终端提供设置TERM的方法时(xterm在命令行选项中执行此操作),用户可以获得更好的结果。
  • 某些终端程序设置其他环境变量,这些变量可以帮助脚本区分使用哪种终端类型。 xterm例如设置XTERM_VERSION。其他人可能会设置COLOR_TERM,但没有关于如何使用该变量的标准。 Terminal.app设置TERM_PROGRAM,iTerm2也是如此。 (默认情况下,这些都不是通过ssh传递的。)
  • (如xterm)模拟VT100的终端提供一个控制序列作为次要细节,该控制序列询问终端 。这不是很有用,因为大多数这些都设置了对VT100使用的代码或某些特定版本的xterm的响应(当然,没有确保终端像xterm一样行事)。 / LI>
  • 您可以使用vttest(菜单6.4“主要属性”)
  • 对此进行测试
  • Terminal.app和iTerm2都宣称他们是VT100。
  • 当前xterm表示它是VT400系列的成员,并列出了它实现的功能(同样,某些程序复制给定的响应而不实际支持这些功能)。
  • vttest还提供了辅助响应的菜单条目(由VT220s及更高版本支持),并在响应中传回其版本号。所提到的一些终端假装是xterm的特定版本。 VTE曾经这样做过;它现在传回版本号。但还有其他一些信息仍然无用。
  • 在更远的地方,除了vttest之外还有其他程序试图识别终端。最初的qterm程序(其他几个具有相同名称但目的不同)通过将模式与终端的响应进行匹配来实现。 tack程序也使用来自ncurses数据库的数据显示终端的响应。
  • 最后,一些终端有办法问他们是什么。 Sun的(现在的Oracle)控制台模拟器完全缺乏此功能。它们不兼容VT100。在wscons手册页中以这种模糊的方式提到它:
  

注意:VT100符合ANSI X3.64标准。但是,由于VT100具有ANSI X3.64的非标准扩展,因此它与Sun终端仿真器不兼容。

有趣的是,上次评论的原因是 Sun 自己对ANSI X3.64的非标准扩展:

  

ESC[s   重置终端仿真器(SUNRESET)

     

不参数。将所有模式重置为默认值,从PROM恢复当前字体。屏幕和光标位置不变。

曾经经常提到过,因为Sun Microsystems的某个人(请参阅本答案的开头)通过将TERM设置为vt100来减少了他们的开发工作。

答案 1 :(得分:0)

您可以使用* nix操作系统和OSX上应该存在的$TERM变量。该变量(通常)由系统初始化,以便让您知道您正在使用哪个终端。

作为奖励,您可以使用toe command查找系统识别的终端类型列表。