Ich konnte einige Beispiele aus demselben Artikel über SO mit dem Titel verwenden: Wie erhalte ich die Cursorposition in Bash? . Ich poste dies hier nur, um zu zeigen, dass sie funktionieren und dass der Inhalt von Lösungen tatsächlich auch auf U & L ist.
Bash-Lösungen
Aus einem Skript heraus
#!/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"
HINWEIS: Ich habe die Ausgabe leicht verändert!
Beispiel
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
Interaktive Shell
Diese Befehlskette diente zum Abrufen der Zeilen- und Spaltenpositionen des Cursors:
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
Beispiel
$ 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
HINWEIS: Diese Methode scheint von keinem Skripttyp aus verwendbar zu sein. Selbst einfache Befehle in einem interaktiven Terminal haben bei mir nicht funktioniert. Beispielsweise:
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
hängt nur auf unbestimmte Zeit.
Dash / Sh-Lösungen
Aus einem Skript heraus
Diese Lösung ist für Ubuntu / Debian-Systeme vorgesehen, die auf Lager dash
sind und POSIX-kompatibel sind. Aus diesem Grund unterstützt der read
Befehl den -d
Schalter unter anderem nicht.
Um dies zu umgehen, gibt es diese Lösung, sleep 1
bei der anstelle des -d
Schalters ein verwendet wird. Dies ist nicht ideal, bietet aber zumindest eine funktionierende Lösung.
#!/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"
Beispiel
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
Interaktive Shell
Ich konnte keine praktikable Lösung finden, die nur sh
in einer interaktiven Shell funktioniert .