如何获得光标在bash中的位置?

在一个bash脚本中,我想让游标列在一个variables中。 它看起来像使用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 

不幸的是,这将打印字符到标准输出,我想静静地做。 此外,这不是很便携…

有没有一种纯粹的方式来实现这一目标?

你必须诉诸肮脏的伎俩:

 #!/bin/bash # based on a script from http://invisible-island.net/xterm/xterm.faq.html exec < /dev/tty oldstty=$(stty -g) stty raw -echo min 0 # on my system, the following line can be replaced by the line below it echo -en "\033[6n" > /dev/tty # tput u7 > /dev/tty # when TERM=xterm (and relatives) IFS=';' read -r -d R -a pos stty $oldstty # change from one-based to zero based so they work with: tput cup $row $col row=$((${pos[0]:2} - 1)) # strip off the esc-[ col=$((${pos[1]} - 1)) 

我知道这可以通过知道来解决,但是你可以告诉阅读以“-s”静静地工作:

 echo -en "\E[6n" read -sdR CURPOS CURPOS=${CURPOS#*[} 

然后CURPOS等于“21; 3”。

为了便于携带,我制作了一个兼容vanilla的POSIX兼容版本,可以像破折号一样运行:

 #!/bin/sh exec < /dev/tty oldstty=$(stty -g) stty raw -echo min 0 tput u7 > /dev/tty sleep 1 IFS=';' read -r row col stty $oldstty row=$(expr $(expr substr $row 3 99) - 1) # Strip leading escape off col=$(expr ${col%R} - 1) # Strip trailing 'R' off echo $col,$row 

…但我似乎无法find一个可行的替代bash的“ 读-d ”。 没有睡眠,脚本完全没有返回输出…

tput命令是你需要使用的。 简单,快捷,不输出到屏幕上。

 #!/bin/bash col=`tput col`; line=`tput line`;