在bash脚本中,我想在变量中获取游标列.看起来使用ANSI转义码{ESC}[6n是获取它的唯一方法,例如以下方式:
# Query the cursor position
echo -en '\033[6n'
# Read it to a variable
read -d R CURCOL
# Extract the column from the variable
CURCOL="${CURCOL##*;}"
# We have the column in the variable
echo $CURCOL
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会将字符打印到标准输出,我想静静地进行.此外,这不是很便携......
是否有一种纯粹的bash方式来实现这一目标?
我想获取光标在终端窗口中的位置。我知道我可以像这个答案一样默默地echo -e "\033[6n"输出,但是我怎样read才能在Python中做到这一点呢?-s
我已经尝试过这样的上下文管理器:
with Capturing() as output:
sys.stdout.write("\e[6n")
print(output)
Run Code Online (Sandbox Code Playgroud)
但它只捕获我编写的\e[6n( '\x1b[6n') 转义序列,而不是^[[x;yR1我需要的序列。
我还尝试生成 asubprocess并获取其输出,但同样,仅捕获我编写的转义序列:
output = subprocess.check_output(["echo", "\033[6n"], shell=False)
print(output)
Run Code Online (Sandbox Code Playgroud)
shell=True使输出成为空字符串列表。
避免curses(因为这应该是一个简单的、穷人的光标 pos getter),我怎样才能获得打印返回的转义序列\e[6n?
我想编写一个小脚本,将图像打印到终端/usr/lib/w3mimgdisplay(就像在 mac osx 中一样lsi)。因此,当脚本启动时,我需要实际的光标位置(或插入符号位置)。到目前为止,我想出了用 ANSI 序列获取 shell 中光标位置的方法:
$ echo -en "\e[6n"
^[[2;1R$ 1R
Run Code Online (Sandbox Code Playgroud)
这就是这个 ANSI 序列的响应的样子(urvxt 和 bash - 不知道这是否重要)。所以这个序列立即打印出结果(^[[2;1R)。这就是我不明白的地方。这是怎么做到的?如果我编写一个非常简单的 shell 脚本,仅使用该指令并跟踪脚本,这并不能解决问题。什么?然后我尝试通过查看 terminfo 联机帮助页来弄清楚这是如何发生的。在这里找不到它(也许我没有努力)。此时我发现自己对这个概念非常困惑。终端是否将位置写入标准输出?
终端
#!/bin/bash
echo -en "\e[6n"
$ strace sh curpos.sh
[...]
read(255, "#!/bin/bash\necho -en \"\\e[6n\"\n", 29) = 29
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 8), ...}) = 0
write(1, "\33[6n", 4) = 4
^[[54;21Rread(255, "", 29) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(0) = ? …Run Code Online (Sandbox Code Playgroud)