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

Jef*_*f82 5 linux bash terminal sh ansi-escape

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

echo -en '\033[6n'
Run Code Online (Sandbox Code Playgroud)

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

谢谢您的帮助.

ric*_*ici 7

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

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

大多数Linux发行版限制访问/dev/vcsN,因此如果您想要使用它们,您将需要特殊权限,或者您需要使用root权限来更改设备文件的访问权限.(Ubuntu似乎提供rw对组中用户的访问tty;检查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字符.