Używam bardzo prostego skryptu, który odczytuje wiersz po wierszu i drukuje wprowadzoną linię z powrotem do terminala:
while read CMD; do
echo $CMD
done
Działa dobrze, ale kiedy próbuję edytować wiersz ze backspace
znakiem, drukuje ^?
zamiast usuwać znak. A kiedy naciskam Ctrl
+ backspace
wyjście jest ^H
. Jak można naprawić to zachowanie, aby backspace
usuwało postać zamiast dodawać te znaki? Próbowałem stty erase '^?'
polecenia, ale nie powiodło się.
command-line
bash
vrom911
źródło
źródło
read CMD
przezread -e CMD
.terminator
zamiastgnome-terminal
. Działa zgodnie z oczekiwaniami-e
opcji. Ale na maszynie @ vrom911 tak nie jest. Zastanawiam się, dlaczego tak się dzieje i gdzie można to skonfigurować.Odpowiedzi:
Problem polega na tym, że istnieje wiele sposobów reprezentowania backspace, ale
read
polecenie nie rozumie wszystkich z nich. Powinieneś być w stanie skonfigurować, co dokładnie jest wysyłane po naciśnięciu ← Backspaceklawisza w ustawieniach emulatora terminala.Zakładając, że używasz
gnome-terminal
jako emulatora, otwórz Manu edycji i kliknij Preferencje profilu . Przejdź na kartę Kompatybilność i powinieneś uzyskać następujące opcje:Teraz możesz zmienić klawisz Backspace generuje: ustawienie. Do wyboru masz pięć poniższych opcji. Dodałem w nawiasach klamrowych, jak zachowują się w moim systemie:
^H
zamiast tego drukuje )^[[3~
zamiast tego drukuje )źródło
type read
mówi i jakie$SHELL --version
raporty powłoki / wersji ?type read
mówiread is a shell builtin
. i$SHELL --version
mówiGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Miałem ten sam problem, używając bash w Gnome-Terminal.
Zauważ, że w linii poleceń backspace działa zgodnie z oczekiwaniami, ale kiedy mój program (prosty klient czatu oparty na gnieździe TCP) czyta ze standardowego wejścia,
backspace
znak drukuje (powraca do ekranu)^?
zamiast kasować ostatni znak.Użyj,
# stty icanon
aby zezwolić na „tryb kanoniczny (gotowany)”. Zobacz niektóre wyjaśnienia tutaj /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalWięcej informacji na temat mojego problemu / rozwiązania: Miałem problem, w którym musiałem wkleić więcej niż 4k znaków. Podczas tych badań doprowadzono mnie do powyższego linku. Kiedyś
# stty -icanon
wyłączałem limit 4k, ale straciłem możliwość używania backspace (kasowanie).źródło