Sono stato in grado di utilizzare alcuni degli esempi tratti dallo stesso articolo su SO, intitolato: Come ottenere la posizione del cursore in bash? . Sto pubblicando questo qui solo per dimostrare che funzionano e che il contenuto delle soluzioni è in realtà anche in U&L.
Soluzioni Bash
Dall'interno di una sceneggiatura
#!/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))
echo "(row,col): $row,$col"
NOTA: ho modificato leggermente l'output!
Esempio
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
Shell interattiva
Questa catena di comandi ha funzionato per ottenere le posizioni di riga e colonna del cursore:
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
Esempio
$ 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: questo metodo non sembra essere utilizzabile da alcun tipo di script. Anche i semplici comandi in un terminale interattivo non hanno funzionato per me. Per esempio:
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
si blocca indefinitamente.
soluzioni dash / sh
Dall'interno di una sceneggiatura
Questa soluzione è per i sistemi Ubuntu / Debian di serie dash
, conforme a POSIX. Per questo motivo, il read
comando non supporta l' -d
opzione tra le altre differenze.
Per ovviare a questo c'è questa soluzione che utilizza un sleep 1
al posto -d
dell'interruttore. Questo non è l'ideale ma offre almeno una soluzione funzionante.
#!/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"
Esempio
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
Shell interattiva
Non riuscivo a trovare una soluzione praticabile che funzionasse solo sh
in una shell interattiva.