Моя (две) версии того же ...
Как функция, устанавливающая определенную переменную, используя определяемые пользователем команды ncurses :
getCPos () {
local v=() t=$(stty -g)
stty -echo
tput u7
IFS='[;' read -rd R -a v
stty $t
CPos=(${v[@]:1})
}
Чем сейчас:
getCPos
echo $CPos
21
echo ${CPos[1]}
1
echo ${CPos[@]}
21 1
declare -p CPos
declare -a CPos=([0]="48" [1]="1")
Примечание: Я использую ncurses
команду: tput u7
в строке #4
в надежде, что это останется на переносным , чем при использовании VT220
строка по команде: printf "\033[6n"
... Не уверен: в любом случае это будет работать с любым из них:
getCPos () {
local v=() t=$(stty -g)
stty -echo
printf "\033[6n"
IFS='[;' read -ra v -d R
stty $t
CPos=(${v[@]:1})
}
будет работать точно так же, в то время как VT220 совместимый TERM.
Подробнее
Вы можете найти там несколько документов:
Справочное руководство по программированию VT220 - Глава 4
4.17.2 Отчет о состоянии устройства (DSR)
...
Host to VT220 (Req 4 cur pos) CSI 6 n "Please report your cursor position using a CPR (not DSR) control sequence."
VT220 to host (CPR response) CSI Pv; Ph R "My cursor is positioned at _____ (Pv); _____ (Ph)."
Pv = vertical position (row)
Ph = horizontal position (column)