J'ai pu utiliser certains des exemples du même article sur SO, intitulé: Comment obtenir la position du curseur dans bash? . Je poste ceci ici juste pour montrer qu'ils fonctionnent et que le contenu des solutions est également sur U&L.
Bash solutions
De l'intérieur d'un 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 "\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"
REMARQUE: j'ai légèrement modifié la sortie!
Exemple
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
Coque interactive
Cette chaîne de commandes a fonctionné pour obtenir les positions de ligne et de colonne du curseur:
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
Exemple
$ 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
REMARQUE: cette méthode ne semble pas utilisable à partir de n'importe quel type de script. Même les commandes simples dans un terminal interactif ne fonctionnaient pas pour moi. Par exemple:
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
se bloque juste indéfiniment.
solutions dash / sh
De l'intérieur d'un script
Cette solution est destinée aux systèmes Ubuntu / Debian fournis en stock dash
, qui sont conformes à POSIX. Pour cette raison, la read
commande ne prend pas en charge le -d
commutateur parmi d'autres différences.
Pour contourner cela, il existe cette solution qui utilise un sleep 1
à la place du -d
commutateur. Ce n'est pas idéal mais offre au moins une solution de travail.
#!/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"
Exemple
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
Coque interactive
Je n'ai pas pu trouver de solution réalisable fonctionnant uniquement sh
dans un shell interactif.