Symbole skrótu (#) zamieniły się w symbole funta (£) po umieszczeniu pliku binarnego


42

Tak wyglądał mój monit bash.

stary monit bash

Potem zrobiłem coś, co prawdopodobnie nie było tak mądre, zrobiłem cat /bin/bash. A teraz mój monit bash wygląda tak, z symbolem funta (£) zamiast symbolu skrótu (#). Wpływa nawet na symbole skrótu w plikach, patrz tutaj:

symbole funta w plikach

Masz pomysł, jak to przywrócić?

Edycja: To pytanie nie pyta „Jak zmienić mój monit bash?”, Ale „mój monit bash zmienił się sam, jak mogę go przywrócić?”

Kompletny.bashrc dla zainteresowanych.




9
Monit, plików itp nadal zawierają kod znakowy #, \x23; po prostu terminal interpretuje teraz \x23jako £.
deltab

4
Interesujące jest to, że „funt” to inna nazwa symbolu skrótu w amerykańskim (i ewentualnie innym narodowości?) Angielskim ... =)
jpmc26

1
W jakim programie terminalowym zostało to wykonane?
SnoringFrog,

Odpowiedzi:


102

Terminal przyjmuje i wykonuje kilka różnych sekwencji znaków jako polecenia sterujące. Na przykład cały ruch kursora odbywa się przy użyciu tych. Niektóre kody wprowadzają trwałe zmiany, takie jak ustawienie kolorów lub nakazanie terminalowi użycia alternatywnego zestawu znaków. Pliki wykonywalne i inne pliki binarne mogą również zawierać bajty reprezentujące te polecenia, więc zrzut plików binarnych do terminala może mieć irytujące skutki uboczne. Zobacz przykład tutaj dla niektórych kodów sterujących.

Historyczne tło tego polega na tym, że pierwotnie terminale były raczej głupimi urządzeniami z ekranem i klawiaturą i łączyły się z rzeczywistym komputerem przez port szeregowy. Wcześniej były to drukarki z klawiaturami. Nie było wiele protokołów oddzielających bajty danych od bajtów poleceń, więc polecenia były przekazywane do terminala „inline”. (A raczej kody ucieczki i znaki kontrolne były protokołem.) Można by założyć, że gdyby dzisiejszy system został opracowany, istniałaby wyraźniejsza separacja między danymi a poleceniami.

Zamiast po prostu zamknąć okno terminala lub zabić emulator, możesz użyć resetpolecenia , które wysyła podobne polecenie (lub kilka), aby przywrócić terminal do normalnych ustawień domyślnych.

Nie wiem, co dokładnie spowodowałoby zmianę wartości skrótu. (Ale @ Random832 tak, zobacz ich odpowiedź .) Jestem bardziej zaznajomiony z „alternatywnym zestawem znaków”, który może zamieniać wszystkie znaki w glify do rysowania linii. Nawet jeśli tak się dzieje, dane z klawiatury zwykle przechodzą bez zmian, więc pisanie resetEnternadal działa, nawet jeśli znaki są wyświetlane jako śmieci lub wcale. (W porównaniu z szybką zmianą w wiersze, masz tylko niewielki efekt).


1
Dziękuję za szczegółowe wyjaśnienie. Podniosę głos, gdy tylko będę miał niezbędną reputację.
lhermann,

2
Kiedy po raz pierwszy spróbowałem cat /dev/urandomw konsoli instalacyjnej Debiana (rozdzielczości ekranu, które przypominają sprzęt z cegły), pomyślałem, że spowodowałem przepełnienie i szybko przeszedłem do przycisku „porzuć wszystkie zmiany, uruchom ponownie komputer”. Teraz wiem, że to „zamierzona funkcja”.
wizzwizz4,

2
To historycznie zamierzona funkcja, która jest teraz niepożądana. Niektóre (wszystkie dobre) emulatory terminali powinny wyłączać wcześniejsze znaki ucieczki z zestawu znaków podczas działania w środowisku UTF-8, ale to, czy to robią, oraz sposób aktywacji opcji, jeśli nie jest domyślny, jest słabo udokumentowany i różni się
R ..

78

Dla przypomnienia, aby odpowiedzieć na pytanie, dlaczego tak się stało i jak można to naprawić bez zamykania terminala (a jeśli się resetnie powiedzie):

Wiele terminali obsługuje, jako cechę emulowanych terminali VT220 , szereg krajowych zestawów znaków zastępczych opartych na ISO 646 i ISO 2022 . W szczególności z jakiegoś powodu jest to bardzo powszechne, nawet jeśli inne nie są obsługiwane, aby obsługiwały brytyjski zestaw znaków, który ma symbol waluty funta w tej samej pozycji, w której ASCII ma znak liczbowy.

Więc, kiedy drukowany plik binarny do terminalu, to przez jakiegoś wyjścia koincydencji sekwencja ESC ( A[a może ESC ) Ai ^N] do terminala. Można to cofnąć ręcznie, drukując sekwencję, która ustawia go w normalny stan:

printf '\e(B\e)0\x0f'

Domyślałem się czegoś takiego, nie znając szczegółów. Dziękuję za wyjaśnienie. Jak wspaniale mieć wokół siebie ludzi takich jak Ty!
lhermann,

1
Och, kochanie, mewy w miejsce Ę i Ö ... A Terminal w OS X obsługuje nawet tę wymianę w 2016 roku. Gdybym tylko miał kolejny głos.
ilkkachu

@ilkkachu niektóre terminale, które w przeciwnym razie je obsługują (znam Putty i myślę, że także konsola Linuksa) odrzucają je, gdy UTF-8 jest w użyciu, ponieważ ISO 2022 mówi, że inne sekwencje (inne niż ESC % @) nie będą obsługiwane w stanie który jest używany do obsługi UTF-8. Mogą więc zniknąć, gdy więcej aplikacji będzie zmuszonych używać UTF-8 do rysowania linii [co jest najczęściej stosowanym faktycznym użyciem tej funkcji, pozostałe zestawy znaków są w większości uwzględnione, ponieważ jest „wolne”, gdy masz zaimplementowany mechanizm ].
Random832,

20
Łatwo zapamiętać te sekwencje ucieczki: „A” oznacza „brytyjski”, „B” oznacza „amerykański”: D
egmont,

8
@egmont Wkopałem się w to, jak się okazuje, są one przypisywane sekwencyjnie w kolejności, w jakiej zostały zarejestrowane w ISO. Pierwszy jest stara wersja międzynarodowa odniesienia [z ¤na $] jest @, a następnie wersja brytyjska się dostać przed oblicze amerykańskiego. itscj.ipsj.or.jp/itscj_english/index.html, aby uzyskać listę wszystkich z nich.
Random832,

30

Zamknij terminal i otwórz nowy.


19
Nie powinieneś Pytanie jest poprawne. Może ktoś wyjaśni szczegółowo, dlaczego tak się stało. To musi być dziura w Bash. £znajduje się pod tym samym kluczem, jak #tylko się go nazywa Alt. Jakoś Altpozostał w Bash. W każdym razie możesz poczekać na właściwe wyjaśnienie lub jeśli jesteś zadowolony z mojej odpowiedzi, kliknij pole wyboru, aby ją zaakceptować.
Tomasz,

1
A raczej nie w Bash, ale w programie terminalowym. Próbowałem tego samego w wierszu poleceń poza interfejsem GUI i pętla trwa wiecznie.
Tomasz,

5
@Xalorous, stany wątpliwości, że problem pojawił się, kiedy cated /bin/bashdo terminalu.
ilkkachu

2
Random832 podał dobre wyjaśnienie tego, co się naprawdę wydarzyło
lhermann

16
To przesada - co zrobić, jeśli w sesji masz jakiś stan, który chcesz zachować? Co jeśli jest to konsola, a nie terminal X? resetjest właściwym narzędziem do pracy.
pericynthion


9

stty sanewydawało się, że rozwiązało problem tak samo, jak to resetzrobiło.


7

Nie ma potrzeby zamykania i ponownego otwierania ani resetowania terminala! Chociaż resetowanie zadziała, nie jest to właściwy sposób!

Musisz tylko wyczyścić / skasować bufor przewijania terminala . Aby to zrobić, użyj poniższego polecenia:

$ echo -ne '\0033\0143'

1
Czy masz wyjaśnienie tego cudu?
Tomasz,

1
@tomas Tak kolego na pewno. kiedy -ejest włączony, rozpozna niektóre sekwencje, o których można przeczytać uruchamiając man echo, jedną z nich jest \0NNNbajt o wartości ósemkowej NNN. W rzeczywistości nie trzeba RESETOWAĆ sesji terminala, wystarczy WYCZYŚĆ bufor buforowania. A polecenie, które powiedziałem, wykona wymaganą pracę. Na przykład, jeśli używasz MacOS X, podczas korzystania z terminalu na pasku menu jest Edycja, a opcja „Wyczyść przewijanie lub ⌥⌘K”.
FarazX

5
Sekwencja \033\143to ESC c, Resetuj do stanu początkowego : „Zresetuj VT100 do stanu początkowego, tj. Do stanu, w jakim ma się po włączeniu. Spowoduje to również wykonanie autotestu rozruchu i sygnał INIT H na bądź krótko pokrzepiony ”.
deltab

1
@deltab Zapomniałem wspomnieć o ESC, dziękuję milionowi partnerowi.
FarazX,

1
@tomas Ilekroć próbujesz wyświetlić plik, który nie powinien być wyświetlany - na przykład pliki binarne - terminal będzie działał dziwnie i niezręcznie. Wielu użytkowników Linuksa wykonuje reset, ale nie jest to najlepsza opcja, ponieważ nie ma potrzeby resetowania sesji terminala, a czyszczenie bufora przewijania jest potrzebne.
FarazX,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.