微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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字符.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐