Może to zabrzmieć dość dziwnie, ale wiem, jak ustawić pionową pozycję kursora w Bash w następujący sposób:
echo -e "\e[12H"
To przesuwa kursor do 12. linii (zaczynając od 1).
Jak więc uzyskać pozycję kursora (numer linii) za pomocą linux bash? Byłoby pomocne, gdybym mógł po prostu zapisać tę wartość w zmiennej, aby móc ją obliczyć.
EDYTOWAĆ:
To jest błąd, który otrzymuję:
$ sh rowcol.sh
-en
read: 9: Illegal option -d
test.sh: 12: Bad substitution
Odpowiedzi:
Byłem w stanie użyć niektórych przykładów z tego samego artykułu na temat SO, zatytułowanego: Jak uzyskać pozycję kursora w bash? . Zamieszczam to tutaj tylko po to, aby pokazać, że działają i że zawartość rozwiązań jest również w U&L.
Rozwiązania Bash
Z wnętrza skryptu
UWAGA: Lekko zmieniłem wyjście!
Przykład
Interaktywna powłoka
Ten łańcuch poleceń pracował dla uzyskania pozycji wiersza i kolumny kursora:
Przykład
UWAGA: Ta metoda nie wydaje się użyteczna z żadnego rodzaju skryptu. Nawet proste polecenia w interaktywnym terminalu nie działały dla mnie. Na przykład:
po prostu zawiesza się na czas nieokreślony.
rozwiązania dash / sh
Z wnętrza skryptu
To rozwiązanie jest przeznaczone dla systemów Ubuntu / Debian, które są dostarczane z zapasami
dash
, co jest zgodne z POSIX. Z tego powoduread
polecenie nie obsługuje-d
przełączania między innymi różnicami.Aby obejść ten problem, istnieje rozwiązanie wykorzystujące
sleep 1
zamiast-d
przełącznika. To nie jest idealne, ale oferuje przynajmniej działające rozwiązanie.Przykład
Interaktywna powłoka
Nie mogłem znaleźć wykonalnego rozwiązania, które działałoby tylko
sh
w interaktywnej powłoce.źródło
sh rowcol.sh
. Nie ma znaczenia, co umieścisz w pierwszym wierszu (#!/bin/bash
lub#!/bin/sh
), ani jakie ma zakończenie pliku!sh
to tylko tryb zgodności zbash
. Kiedy to robię (sh rowcol.bash
), to działa, czy to nie działa dla ciebie?alias sh=bash
?Za pomocą
-p
opcji zamiastecho
znalazłem rozwiązanie problemu z zawieszaniem się w skrypcie. Testowane zGNU bash, version 3.00.16(1)-release (x86_64-redhat-linux-gnu)
.działa interaktywnie lub w skrypcie:
Wyjścia:
źródło
Można uzyskać poprzez położenie kursora
ANSI CSI DSR
(Device status raportu):\e[6n
. Zwróć uwagę, że zwraca go w formacie podobnym doANSI CSR CUP
(Pozycja kursora), o którym wspomniałeś w swoim pytaniu, jednak ma on postać\e[n;mR
(gdzie n jest rzędem, a m kolumną).Więcej szczegółów kodów ucieczkowych ANSI na wikipedii .
Aby uzyskać wartość w zmiennej, odpowiedziano na StackOverflow .
Jak wspomniano w poprzedniej odpowiedzi / komentarzu (szczegółowo opisanym w artykule na Wikipedii), kody te nie zawsze są przenośne (od terminala do terminala i systemu operacyjnego do systemu operacyjnego). Nadal uważam, że lepiej sobie z tym poradzić za pomocą termcap / curses;)
źródło
echo -e
,echo -en
iread ...
. Dzieje się tak tylko wtedy, gdy kod jest obecny w pliku! Naprawdę tego nie rozumiem!echo -e
działało wcześniej, ale teraz nie! Co mogło to spowodować i jak je przywrócić?Ze
sh
składnią POSIX :źródło