linux – 如何在bash中查询当前光标位置或屏幕上任何位置的字符

我知道以下语句是查询当前光标位置的一种方法

echo -en '\033[6n'

有谁知道如何查询光标下的字符或用当前屏幕/窗口的内容填充数组?我已经搜索过ANSI终端命令,但是很多这些命令都是非常抽象的,看起来它们看起来不会这么做.我也考虑过用tcup命令做这件事而没有运气.

谢谢您的帮助.

解决方法:

ANSI终端并不需要能够告诉您屏幕上的内容.如果你需要这些信息,你应该记住自己.例如,流行的ncurses库可以实现这一点,尽管它只允许您将屏幕导出到文件,并且没有记录文件格式.无论如何,bash不使用ncurses,所以它实际上对控制台的状态一无所知.

最有可能的是,您所谈论的屏幕实际上是某些终端仿真程序(如xterm)的工件.这些程序在用户空间中运行,很少(如果有的话)具有外部查询接口.但是,linux确实有一个控制台(实际上,有许多模拟控制台,但使用显示器的控制台模式)并且它维护这些控制台的显示内存.此外,它提供了一个用于读取控制台内存的接口,通常可用作/ dev / vcsN(对于0之间的N值和linux编译的虚拟控制台的数量). / dev / vcs0是“当前”控制台(可见的控制台).

大多数Linux发行版都限制对/ dev / vcsN的访问,因此如果您想要使用它们,您将需要特殊权限,或者您需要使用root权限来更改设备文件的访问权限. (Ubuntu似乎为组tty中的用户提供rw访问权限;请检查ls -l / dev / vcs0以查看系统是如何进行的.)(当然,您需要找到控制台:-)尝试CtlAlt1; CtlAlt7可能会回复你的GUI.)

一旦解决了访问问题,就可以执行类似cp / dev / vcs0 console_memory的操作来查看它.您会发现它只是一个没有换行符的2D字符数组,并且没有指示尺寸是什么. (您可以使用ioctl或通过查看环境变量$LInes和$COLUMNS来获取维度.)

您可以使用/ dev / vcsa0代替;它的格式略有不同,每个字符使用两个字节,以便存储显示属性(主要是前景色和背景色)以及字符.此外,/ dev / vcsaN的前四个字节是屏幕尺寸和光标位置(每个坐标一个字节),这将为您节省查询光标位置的工作.

请注意,控制台不支持完整的Unicode字符集.实际上,它一次只能显示512个不同的字形.为了最大化可用的字形空间,Linux可能会将某些代码重新分配给所需的符号,并且此映射不是控制台内存的一部分.因此从控制台内存中提取代码可能没有明显的映射到Unicode代码,但它应该适用于标准ANSI字符.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...