To, co zauważyłem w Ubuntu od dłuższego czasu, było dla mnie frustrujące, gdy piszę polecenie w wierszu polecenia, które staje się dłuższe (szersze) niż szerokość terminalu, zamiast owijania do nowej linii, wraca do kolumna 1 w tym samym wierszu i zaczyna nadpisywanie początku mojej linii poleceń. (W rzeczywistości nie zastępuje rzeczywistego polecenia, ale wizualnie zastępuje wyświetlany tekst).
Trudno to wyjaśnić, nie widząc go, ale powiedzmy, że mój terminal miał 20 znaków szerokości (mój ma więcej niż 120 znaków - ale dla przykładu) i chcę powtórzyć alfabet angielski. To, co wpisuję, to:
echo abcdefghijklmnopqrstuvwxyz
Ale zanim wcisnę klawisz, wygląda mój terminal:
pqrstuvwxyzghijklmno
Kiedy nacisnę klawisz Enter, odbija się echem
abcdefghijklmnopqrstuvwxyz
więc wiem, że polecenie zostało poprawnie odebrane. Po prostu owinął moje pisanie po „o” i zaczął od nowa w tej samej linii.
Oczekiwałbym, że tak się stanie, gdybym wpisał to polecenie na terminalu o szerokości zaledwie 20 znaków, to:
echo abcdefghijklmno
pqrstuvwxyz
Tło: używam bash jako mojej powłoki i mam ten wiersz w moim ~ / .bashrc:
set -o vi
aby móc poruszać się po linii poleceń za pomocą komend VI. Obecnie używam serwera Ubuntu 10.10 i łączę się z serwerem za pomocą Putty.
W każdym innym środowisku, w którym pracowałem, wpisanie długiego wiersza polecenia spowoduje dodanie nowego wiersza pod wierszem, nad którym pracuję, gdy moje polecenie wydłuży się poza szerokość terminala i gdy będę wpisywać, mogę zobaczyć moje polecenie na 2 różne linie. Ale tak długo, jak pamiętam używanie Ubuntu, moje długie polecenia zajmują tylko 1 linię.
Dzieje się tak również wtedy, gdy wracam do poprzednich poleceń w historii (wciskam Esc, a następnie „K”, aby wrócić do poprzednich poleceń) - kiedy przechodzę do poprzedniego polecenia, które było dłuższe niż szerokość terminala, wiersz poleceń otrzymuje zniekształcony i nie mogę powiedzieć, gdzie jestem w poleceniu.
Jedynym obejściem, które obejrzałem, aby zobaczyć całe długie polecenie, jest naciśnięcie „Esc-V”, co otwiera bieżące polecenie w edytorze VI.
Nie sądzę, że mam coś dziwnego w moim pliku .bashrc. Skomentowałem linię „set -o vi” i nadal miałem problem.
Pobrałem świeżą kopię Putty i nie wprowadziłem żadnych zmian w konfiguracji - po prostu wpisałem nazwę hosta, aby się połączyć, i nadal mam problem, więc nie sądzę, że to nic z Putty (chyba że muszę wprowadzić zmiany w konfiguracji)
Czy ktoś jeszcze miał ten problem i czy ktoś może wymyślić, jak go naprawić?
Edytować
To był mój plik .bashrc. Skopiowałem ten sam profil z maszyny na maszynę i użyłem znaków specjalnych w moim $ PS1, które w jakiś sposób go wyrzucają. Teraz trzymam się standardowych zmiennych bash dla mojego $ PS1.
Dzięki @ ændrük za wskazówkę dotyczącą .bashrc!
... Zakończ edycję ...
źródło
/etc/skel/.bashrc
. Pamiętaj, że musisz ponownie połączyć, aby zmiany odniosły skutek, i pamiętaj o utworzeniu kopii zapasowej własnego pliku .bashrc.tput smam
Odpowiedzi:
Upewnij się, że wszystkie bajty niedrukowalne na twoim PS1 są zawarte
\[ \]
. W przeciwnym razie bash policzy je w długości monitu. Używa długości monitu, aby określić, kiedy należy zawinąć linię.Na przykład tutaj bash liczy monit o szerokości 19 kolumn, podczas gdy monit wyświetlany przez terminal ma tylko 10 kolumn (
My prompt
napisany na niebiesko i>
zapisany w domyślnym kolorze):podczas gdy tutaj liczy tylko wiersz jako szerokość 10 kolumn, ponieważ ignoruje bajty między znakiem specjalnym
\[
i\]
znakami ucieczki:Jednak dla dobrej praktyki używaj
tput
do generowania znaków ucieczki terminala zamiast kodowania ich na stałe:Zobacz http://mywiki.wooledge.org/BashFAQ/053 , a także http://wiki.bash-hackers.org/scripting/terminalcodes, aby uzyskać więcej informacji
tput
.źródło
PS1='...'
: dlaczego nie pojedyncze cytaty zapobiegania$cyan
i$reset
od podstawienia?$cyan
i$reset
są zastępowane, alePS1
są oceniane za każdym razem, gdy monit jest drukowany. Możesz to zobaczyć, próbującPS1='$var> '
następnie podaćvar
różne wartości i zobaczyć, jak monit zmienia się. Następnie spróbujPS1="$var> "
zauważyć, że monit pozostaje statyczny;$var
został rozszerzony podczas zadania, nie za każdym razemPS1
jest oceniany.PS1=${PS1}"\e]2;$@\a"
. PróbowałemPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Myślę, że masz skonfigurowane
PS1
kolory, prawda?Po prostu upewnij się, że masz
\[
wewnątrzPS1
cytatu poprzedzającego zestaw kolorówNa przykład:
źródło
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
- używam go od dłuższego czasu - jest kompatybilny z KSH ...\[
\]
\\[
był literówką spowodowaną edycją. Naprawiłem to.Miałem podobny problem i wreszcie znalazłem proste rozwiązanie.
Dodaj następujący wiersz do
.bashrc
pliku:Następnie wpisz,
source ~/.bashrc
aby uzyskać pożądany efekt.źródło
source .bashrc
. Twojesetwinsize
ustawiłem shopt na moją bash, więc nie aktualizowałem poprawnie KOLUMNexport COLUMNS=250
następujeexport TERM=xterm
i był zadowolony.Miałem ten sam problem z niestandardowym kolorowym monitem, mimo że zawierałem kody kolorów wewnątrz
\[
i\]
ograniczniki. Okazuje się, że bash ma problemy z odbiciem kolorów z wnętrza funkcji . Skończyło się na tym, że użyłem zmiennych do pytania i chociaż mój .bashrc jest trochę mniej elegancki, wszystko działa teraz dobrze.źródło
Prostą rzeczą byłoby dodanie następującego wiersza przed ustawieniem PS1:
Na przykład,
wpływa to jednak na inne polecenia unixowe, takie jak ls i man.
źródło
Miałem ten problem po podłączeniu do Tmux. Problem polegał na tym, że miałem
ipython
sesję w tle (ctrl + z
) i że jakoś zepsuło się zawijanie linii. Gdy tylko go zakończyłem (fg
,ctrl+d+d
) mój terminal zaczął działać poprawnieSprawdź więc wszelkie zatrzymane interaktywne monity.
źródło
Właśnie miałem ten sam problem z lekkim zwrotem i pomyślałem, że podzielę się również moim rozwiązaniem, aby dodać mój mały niuans: D
Mój początkowy PS1 to był
Problemem było to, że próbowałem zmienić tytuł terminalu, a także wiersz polecenia. Sposób, w jaki to zrobiłem, polegał na dodaniu
\[\033]0;\]Title\a
do zmiennej PS1 .Więc teraz mój PS1 to:
To pomieszało mi owijanie linii. W końcu doszedłem do wniosku, że bash nie wydaje się mieć
\a
końca. Aby to obejść, umieściłem tytuł w zmiennej, która wydawała się go naprawić.źródło
\[
i\]
nie działało dla mnie. Wydaje mi się, że było coś innego w tym, jak generowałem monit (z zewnętrznego programu) lub dlatego, że mój monit był „dynamiczny”.Po przeczytaniu tego stwierdziłem, że można właściwie uniknąć kodów kolorów za pomocą bajtów
0x01
i0x02
.np. używam specjalnej wersji kredy i owijam kolory za pomocą tego:
źródło