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

7

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

echo -en '\033[6n'

有人知道如何查询光标下的字符或者用当前屏幕/窗口的内容填充一个数组吗?我已经搜索了ANSI终端命令,但很多都比较抽象,看起来不太适合这个需求。我还尝试使用tcup命令,但没有成功。

谢谢您的帮助。

1个回答

7
一个 ANSI 终端并不真正需要能够告诉你屏幕上显示的内容。如果你需要这些信息,你应该自己记住。流行的 ncurses 库就是这样做的,尽管它只允许将屏幕导出到一个文件中,而且该文件格式没有文档说明。无论如何,bash 并不使用 ncurses,所以它对控制台的状态一无所知。
最有可能的情况是,你谈论的屏幕实际上是某个终端仿真程序(如 xterm)的产物。这些程序运行在用户空间中,并且很少(如果有的话)具有外部查询接口。然而,Linux 确实有一个控制台(实际上是一些模拟控制台,但使用了显示器的控制台模式),并且它维护这些控制台的显示内存。此外,它还提供了一个读取控制台内存的接口,通常可用作 /dev/vcsN(对于 Linux 编译时的虚拟控制台数值 N 在 0 到该数字之间)。/dev/vcs0 是“当前”控制台(可见的那个)。
大多数 Linux 发行版限制对 /dev/vcsN 的访问,因此如果你想玩弄它们,你要么需要特殊权限,要么需要使用 root 权限更改设备文件的访问权限。(Ubuntu 似乎为 tty 组中的用户提供了 rw 访问权限;检查 ls -l /dev/vcs0 以查看你的系统如何处理。)(当然,你需要找到控制台 :-) 尝试 CtlAlt1CtlAlt7 可能会把 GUI 还给你。)
一旦你解决了访问问题,你可以做类似于 cp /dev/vcs0 console_memory 的事情来查看它。你会发现它只是一个没有换行符的字符二维数组,并且没有指示尺寸的标志。(你可以通过 ioctl 或查看环境变量 $LINES$COLUMNS 来获取尺寸。)
你可以使用 /dev/vcsa0 替代;它具有稍微不同的格式,每个字符使用两个字节来存储显示属性(主要是前景和背景颜色),以及字符本身。此外,/dev/vcsaN 的前四个字节是屏幕尺寸和光标位置(每个坐标一个字节),这将为你查询光标位置省去了工作。
请注意,控制台不支持完整的Unicode字符集。实际上,它一次只能显示512个不同的字形。为了最大化可用的字形空间,Linux可能会重新分配一些代码到需要的符号,并且这种映射不是控制台内存的一部分。因此,从控制台内存中提取的代码可能没有明显的Unicode代码映射,但对于标准ANSI字符来说应该可以正常工作。

谢谢您的帮助。我一直尽力避免使用ncurses,如果我必须要跟踪屏幕,那么每当屏幕写入时,脚本将填充数组,我只是担心这会导致额外的开销。我现在会尝试这个方法。我正在使用像Centos上的/dev/pts/1这样的伪终端,希望它也能适用于这种情况。我真的希望有一个转义序列可以发送到终端程序,该序列类似于我的问题中的转义序列,可以返回光标位置处文本的内容。 - Jeff82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接