Consegui usar alguns dos exemplos do mesmo artigo sobre SO, intitulado: Como obter a posição do cursor no bash? . Estou postando isso aqui só para mostrar que eles funcionam e que o conteúdo das soluções está na verdade em U & L.
Soluções Bash
De dentro de um script
#!/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 "3[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))
echo "(row,col): $row,$col"
OBSERVAÇÃO: alterei a saída um pouco!
Exemplo
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
Shell interativo
Esta cadeia de comando funcionou para obter as posições de linha e coluna do cursor:
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
Exemplo
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
13;1
$ clear
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
2;1
NOTA: Este método não parece ser utilizável de nenhum tipo de script. Mesmo comandos simples em um terminal interativo não funcionaram para mim. Por exemplo:
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
apenas trava indefinidamente.
soluções dash / sh
De dentro de um script
Esta solução é para sistemas Ubuntu / Debian que vêm em estoque com dash
, que é compatível com POSIX. Por causa disso, o comando read
não suporta a opção -d
entre outras diferenças.
Para contornar isso, existe essa solução que usa um sleep 1
no lugar da opção -d
. Isso não é ideal, mas oferece pelo menos uma solução de trabalho.
#!/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 "(row,col): $col,$row"
Exemplo
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
Shell interativo
Não consegui encontrar uma solução viável que funcionasse apenas para sh
em um shell interativo.