Mam problem polegający na tym, że jeśli wpisuję bardzo długie polecenia w bash, terminal nie wyświetla poprawnie tego, co wpisuję. Spodziewałbym się tego, gdybym miał takie polecenie:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
Polecenie powinno być renderowane w dwóch wierszach. Zamiast tego często się zawija i zaczyna pisać na górze mojego monitu, trochę tak:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Jeśli zdecyduję się wrócić i zmienić jakiś argument, nie będzie wiadomo, gdzie pojawi się kursor, czasem w środku monitu, ale zwykle w wierszu powyżej, w którym piszę.
Dodatkowa zabawa dzieje się, gdy wykonuję Uppoprzednie polecenie. Próbowałem tego w gnome-terminalu i terminatorze oraz na i3 i Cinnamon. Ktoś zasugerował, że to moja zachęta, więc oto:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll, reset
i clear
wszyscy robią to, co mówią, ale kiedy ponownie wpisuję polecenie lub Updzieje się to samo.
Sprawdziłem i checkwinsize
jest włączony w bash. Dzieje się tak w przypadku okien o rozmiarze 80x24 i innych.
Czy to jest coś, z czym uczę się żyć? Czy jest jakaś magia, którą powinienem znać? Postanowiłem skorzystać z bardzo krótkiego monitu, ale to nie rozwiązuje problemu.
env -i bash --norc
naprawia to. $ COLUMNS i $ LINES pasują do siebie. Czy to oznacza, że w moim .bashrc jest coś śmiesznego?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
wydaje się unikać dziwności w zachowaniu - ale nie wiem, czy całkowicie szanuje twoje pierwotnetput smam
Odpowiedzi:
Sekwencje niedrukowalne powinny być ujęte w
\[
i\]
. Patrząc na twój PS1 , ma on potem niezamkniętą sekwencję\W
. Ale drugi wpis jest zbędny, a także powtarza poprzednie zdanie „1; 34” .Jako taki powinien mieć zamierzony kolor:
Zachowanie „oryginału” powinno również działać:
Edytować:
Przyczyną takiego zachowania jest
bash
przekonanie, że podpowiedź jest dłuższa niż w rzeczywistości. Jako prosty przykład, jeśli użyjesz:Podpowiada się, że ma 8 znaków, a nie 1. W związku z tym, jeśli okno terminala ma 20 kolumn, po wpisaniu 12 znaków uważa się, że ma 20 znaków i jest zawijanych. Jest to również widoczne, jeśli następnie spróbujesz zrobić backspace lub Ctrl+u. Zatrzymuje się w kolumnie 9.
Jednak nie rozpoczyna także nowego wiersza, chyba że jeden znajduje się w ostatniej kolumnie, w wyniku czego pierwszy wiersz zostaje nadpisany.
Jeśli ktoś nadal pisze, wiersz powinien zawijać się do następnego wiersza po 32 znakach.
źródło
Ma to głównie związek z tym, że rozmiar okna przyjęty przez terminal nie jest taki sam, jak rzeczywisty rozmiar okna. Jeśli używasz bash, możesz spróbować tego.
Jeśli nie dostaniesz
Następnie aktywuj go za pomocą
Następnie po prostu spróbuj uruchomić inne polecenie (jak
ls
) lub zmienić rozmiar okna raz, powyższe działa dla mnie za każdym razem.Szczególnie w przypadku systemów Redhat problem jest często spowodowany błędną konfiguracją,
~/.bashrc
aby nie dzwonić/etc/bashrc
. Zwykle ładowanie bash,~/.bashrc
które ma wywołać/etc/bashrc
, które domyślnie zawierashopt -s checkwinsize
.źródło
/etc/bashrc
, wszystko inne było dobre do zrobienia ... okazuje się, że jest to przyczyną problemów z opakowaniem.shopt -s checkwinsize
w sesji ssh. Ale opakowanie nadal trwa.Jak wspomniano w innych odpowiedziach, sekwencje niedrukowalne, takie jak
\e[0;30m
powinny być owinięte\[...\]
.Dodatkowo (i o czym jeszcze nie wspomniałem) wydaje się, że
\r\n
powinno być poza tym,\[...\]
jeśli masz wieloliniowy monit. Zajęło mi trochę prób i błędów, aby w końcu to zrozumieć.źródło
Kiedyś czytałem gdzieś (nie wiem już gdzie), że używając
\001
i\002
zamiast\[
i\]
mogę rozwiązać ten problem. To mi zrobiło.Nawiasem mówiąc, definiowanie PS1 nie musi wyglądać brzydko.
źródło
To brzmi jak problem z twoimi ustawieniami
COLUMNS
iLINES
zmiennymi środowiskowymi. Kiedy zmieniasz rozmiar okna, zazwyczaj są one ustawiane automatycznie przez terminal gnome (uważam), możesz zmusić je do ręcznego ustawienia, wydając polecenieresize
.Przykład
Jeśli zmienię rozmiar mojego terminalu gnome na 79x17, moje zmienne pojawią się w następujący sposób:
Mogę to tak wymusić:
źródło
Aby zapobiec zawijaniu, możesz również zwiększyć liczbę kolumn, używając np
źródło
Ten sam problem może być również spowodowany użyciem szerokich symboli Unicode (np. Https://stackoverflow.com/a/34812608/1657819 ). Oto fragment kodu, który powoduje problem (zwróć uwagę na ciągi kolorów
$Green
i$Red
są one odpowiednio usuwane):Bash nie może poprawnie obliczyć długości, więc najprostszym sposobem może być ucieczka 2 z trzech części tych szerokich symboli.
źródło
\001
i\002
.