![从屏幕上的 xy 坐标读取字符](https://linux22.com/image/46896/%E4%BB%8E%E5%B1%8F%E5%B9%95%E4%B8%8A%E7%9A%84%20xy%20%E5%9D%90%E6%A0%87%E8%AF%BB%E5%8F%96%E5%AD%97%E7%AC%A6.png)
bash 有没有办法从屏幕上的 xy 坐标读取字符?这个命令类似于
cget 12 30
这将返回第 12 行第 30 列的字符。
答案1
如果您在文本模式下使用控制台 ttys(/dev/tty1
通过/dev/tty7
),您可以直接从相应的设备读取屏幕缓冲区/dev/vcsN
。
由于您不应该真正假设每行有 80 个字符,因此有必要要求终端显示每行的字符。然后简单的数学将 (x,y) 坐标转换为偏移量 (y*c + x) 将得到所需的字符:
#!/bin/bash
#
my_tty=$(tty)
vcs_nr="${my_tty/*tty/}"
# Read Y, X from first two characters of /dev/vcsaN (we only use X)
xwidth=$(
dd if="/dev/vcsa$vcs_nr" bs=1c count=2 2>/dev/null |
od -t u1 -A d |
awk '{print $3; exit}'
)
# Calculate byte offset into the screen
offset=$(( ($2 -1) * xwidth + ($1 -1) ))
# Read the data
dd count=1 skip="$offset" bs=1 if="/dev/vcs$vcs_nr" 2>/dev/null
当然,这假定具有对 /dev/vcsN 设备的 root 访问权限。