我知道以下语句是查询当前光标位置的方法:
echo -en '\033[6n'
有人知道如何查询光标下的字符或者用当前屏幕/窗口的内容填充一个数组吗?我已经搜索了ANSI终端命令,但很多都比较抽象,看起来不太适合这个需求。我还尝试使用tcup
命令,但没有成功。
谢谢您的帮助。
我知道以下语句是查询当前光标位置的方法:
echo -en '\033[6n'
有人知道如何查询光标下的字符或者用当前屏幕/窗口的内容填充一个数组吗?我已经搜索了ANSI终端命令,但很多都比较抽象,看起来不太适合这个需求。我还尝试使用tcup
命令,但没有成功。
谢谢您的帮助。
ncurses
库就是这样做的,尽管它只允许将屏幕导出到一个文件中,而且该文件格式没有文档说明。无论如何,bash
并不使用 ncurses
,所以它对控制台的状态一无所知。xterm
)的产物。这些程序运行在用户空间中,并且很少(如果有的话)具有外部查询接口。然而,Linux 确实有一个控制台(实际上是一些模拟控制台,但使用了显示器的控制台模式),并且它维护这些控制台的显示内存。此外,它还提供了一个读取控制台内存的接口,通常可用作 /dev/vcsN
(对于 Linux 编译时的虚拟控制台数值 N
在 0 到该数字之间)。/dev/vcs0
是“当前”控制台(可见的那个)。/dev/vcsN
的访问,因此如果你想玩弄它们,你要么需要特殊权限,要么需要使用 root 权限更改设备文件的访问权限。(Ubuntu 似乎为 tty 组中的用户提供了 rw
访问权限;检查 ls -l /dev/vcs0
以查看你的系统如何处理。)(当然,你需要找到控制台 :-) 尝试 CtlAlt1;CtlAlt7 可能会把 GUI 还给你。)cp /dev/vcs0 console_memory
的事情来查看它。你会发现它只是一个没有换行符的字符二维数组,并且没有指示尺寸的标志。(你可以通过 ioctl
或查看环境变量 $LINES
和 $COLUMNS
来获取尺寸。)/dev/vcsa0
替代;它具有稍微不同的格式,每个字符使用两个字节来存储显示属性(主要是前景和背景颜色),以及字符本身。此外,/dev/vcsaN
的前四个字节是屏幕尺寸和光标位置(每个坐标一个字节),这将为你查询光标位置省去了工作。