Czy jest jakiś powód, dla którego dostaję ^ [[A, kiedy naciskam strzałkę w górę na ekranie logowania do konsoli?


32

Za każdym razem, gdy loguję się do konsoli, upcelowo naciskam strzałkę, aby zobaczyć wcześniej wpisane polecenia. Ale ja to widzę ^[[A.

Ale kiedy naciskam Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winklawisze, nie echo żadnych znaków.

Co może być przyczyną?

Czy ^[[Ajakieś postacie sugerują coś?

wprowadź opis zdjęcia tutaj

Odpowiedzi:


20

W ten sposób terminal reprezentuje nieprzetworzony kod klawisza Up przesłanego do niego przez klawiaturę. Zasadniczo twoja powłoka normalnie przechwytuje naciśnięcie klawisza, ale nie ma nic do zrobienia po wyświetleniu monitu logowania. Tak więc wpisany znak jest drukowany na konsoli, tak jak każda inna litera (lub cyfra, czy cokolwiek innego).


3
@RubanSavvy Ctrl, Alt i Win (często nazywane Super w świecie GNU / Linux) są modyfikatorami. Jeśli naciśniesz i klawisz, na ekranie zobaczysz coś innego. Scroll lock, który, jak podejrzewam, jest interpretowany przez jądro lub coś innego na niskim poziomie, dla kontroli tty, chociaż nie jestem pewien. Strona w górę i w dół jest prawdopodobnie połknięta przez gettylub login, chociaż nie jestem pewna dlaczego. Uczone zgadywanie mówi, że ekran drukowania jest interpretowany specjalnie przez jądro ze względów historycznych. Nie jestem jednak w 100% pewien, z wyjątkiem modyfikatorów.
strugee,

3
powyższe należy prawdopodobnie edytować w odpowiedzi.
strugee,


19

Klawiatury wysyłają zdarzenia do komputera. Wydarzenie mówi „skanuj kod nnn w dół” lub „skanuj kod nnn w górę”. Na drugim końcu łańcucha aplikacje działające w terminalu oczekują danych wejściowych w postaci sekwencji znaków. (Chyba że zażądali surowego dostępu, tak jak robi to serwer X.) Po naciśnięciu Aklawiatura wysyła informację „skanuj kod 38 w dół”. Sterownik konsoli wyszukuje mapę klawiszy i przekształca ją w „znak a” (jeśli nie zostanie naciśnięty żaden klawisz modyfikujący).

Po naciśnięciu klawisza lub kombinacji klawiszy, która nie daje znaku, informacja musi zostać zakodowana w postaci znaków. Kilka klawiszy i kombinacji klawiszy ma odpowiadające znaki sterujące, np. Ctrl+ AWysyła znak (wartość bajtu 1), Returnwysyła znak (Ctrl + M, wartość bajtu 13) itp. Większość klawiszy funkcyjnych nie ma odpowiedniego znaku i zamiast tego wysyła sekwencja znaków rozpoczynająca się od znaku (ucieczka, wartość bajtu 27). Na przykład klucz Upjest tłumaczony na sekwencję zmiany znaczenia ␛[A(trzy znaki: escape, otwarty nawias, wielka litera A).

Monit o nazwę użytkownika w konsoli jest głupi i nie rozumie większości sekwencji specjalnych. Nie ma funkcji edycji linii i historii, do których jesteś przyzwyczajony: są one dostarczane przez powłokę i dopóki się nie zalogujesz, nie masz powłoki. Więc po prostu wyświetla sekwencję ucieczki. Dla znaku nie ma glifu , więc jest wyświetlany jako ^[. ^Znak jest tradycyjnie stosowany jako przedrostek dla znaków sterujących, a ucieczka jest ^[ze względu na jej wartość bajtów: to wartość bajt [, minus 64.

Jeśli naciśniesz Uppo znaku zachęty powłoki, spowoduje to wysłanie tej samej 3-znakowej sekwencji do powłoki. Powłoka interpretuje to jako sekwencję poleceń (zwykle w celu przywołania poprzedniego elementu historii). Jeśli naciśniesz Ctrl+ Vwtedy Uppo znaku zachęty powłoki, wstawi to sekwencję zmiany znaczenia w wierszu polecenia: Ctrl+ Vto polecenie, aby wstawić dosłownie następny znak zamiast interpretować go jako polecenie, więc znak nie jest interpretowany jako początek sekwencji ucieczki .

Niektóre klucze są jedynie modyfikatorami i nie są przesyłane do aplikacji terminalowych. Na przykład po naciśnięciu Shiftta informacja pozostaje w sterowniku terminalu i jest brana pod uwagę, jeśli następnie naciśniesz A, więc sterownik Azamiast tego przesyła do aplikacji a.

Ponadto niektóre klawisze funkcyjne mogą nie być mapowane w konsoli.

Aby zobaczyć podobny widok w GUI, zobacz Co to jest meta-klucz bash?


To świetna odpowiedź, jak zawsze dzięki Gilles.
JoshuaRLi

5

Nie chodzi o to, jak klucze są reprezentowane przez „terminal” (tj. Aplikację emulatora terminala). To, co widzisz, to kod ANSI ( sekwencja ucieczki ANSI ) służący do poruszania się o jedną linię w górę, ale przetłumaczony na postać do wydruku.

  1. Sprzęt klawiatury wysyła „kody skanowania”, ale są one tłumaczone i przedstawiane w aplikacjach na poziomie wiersza poleceń jako znaki. Klawisz Astaje się jednym bajtem: Ajeśli klawisz Shift jest wciśnięty (lub Shift Lock), w aprzeciwnym razie.

  2. W terminalu ANSI zgodny klawisze strzałek nie wysyłać pojedynczy znak (nie ma kodów dla strzałki w zestawie znaków ASCII), ale 3-znakowy „sekwencję escape”: escape-[-A. Pozostałe trzy klawisze strzałek to escape-[-B, C, D.

  3. Ta sama sekwencja znaków przesuwa kursor o jedną linię w górę, jeśli zostanie wysłana (echo) do starego fizycznego terminala ANSI. Wiele programów, w tym emulatory terminali, rozpoznaje te sekwencje znaków i robi coś odpowiedniego: emulatory terminali przesuwają kursor w górę (tak cursesbiblioteka porusza kursorem), ale bashprzechwytują go i przewijają historię.

  4. Aby uniknąć sytuacji, w której kursor kończy się wszędzie w programach, które nie służą do przesuwania kursora po ekranie, często ESC na klawiaturze wyświetla się jako sekwencja do wydrukowania ^[(ponieważ ucieczka odpowiada control-[). Jest to faktycznie obsługiwane przez interfejs urządzenia końcowego; zob stty(1). W rezultacie strzałka w górę pojawi się jako ^[[A. Zobaczysz to z wiersza poleceń, jeśli wpiszesz cat, wrócisz return i naciśniesz kilka klawiszy strzałek. To samo widziałeś na ekranie logowania do konsoli.

Wreszcie: Control, Alt, a pozostałe klawisze, które wymieniłeś nie mapować do sekwencji znaków. Wpływają na znak wysłany przez inne naciśnięcie klawisza (np. a/ APrzykład powyżej) lub po prostu nie mają mapowania na tekst. Takie naciśnięcia klawiszy mogą być wykryte tylko przez programy, które nasłuchują zdarzeń klawiatury. Nie można ich zobaczyć, czytając ze standardowego wejścia (lub zapisać w pliku).


3

To zachowanie różni się od powłoki do powłoki. Większość powłok używa biblioteki wywoływanej readlinedo edycji linii w wierszu poleceń. Oto pełne readlinezestawienie poleceń dla tej biblioteki, więc gdy używasz aplikacji , możesz edytować i nawigować po wierszach za pomocą tych poleceń.

Pionowe klawisze strzałek są skonfigurowane w trybie readline do nawigacji w historii poleceń. A w potwierdzeniu logowania nie ma historii poleceń. Właśnie dlatego znaki ^[[Ai ^[[Bsą drukowane na ekranie. Co to ^[[Aznaczy?

Strona podręcznika bash mówi pod PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Te sekwencje specjalne dla klawiszy strzałek w ANSI to:

  • [ValueAKursor w górę (gdzie Valuemoże być pusty)

  • [ValueBKursor w dół (gdzie Valuemoże być pusty)


5
Twoja odpowiedź dotyczy innej rzeczy, ponieważ monit logowania jest drukowany i obsługiwany przez login, co nie jest powiązane bash.
Risto Salminen,

1
bashi loginużywają tej samej biblioteki (readline) do edycji linii. Różnica polega na tym, loginże nie interpretują klawiszy strzałek pionowych jako polecenia, podobnie jak bashrobi.
chaos

Tak, przyznaję to.
Risto Salminen,

Składnia bash ma wyglądać jak ^[reprezentacja escape, ale są to różne rzeczy. Bash mógł w ogóle użyć dowolnej składni. W rzeczywistości, kiedy piszesz \[A, bash wyświetla trzy znaki: ^[(tj ewakuacyjnych) [, A.
Alexis,

0

Są to kody ucieczki ANSI . ^[to notacja używana przez powłokę do wyświetlania ESCbajtu (bajt 27 ASCII). Zatem twoim przykładem jest bajt ESC, po którym następuje tekst [A. Jak widać w artykule w Wikipedii, ^[[( ESCpo nim [) jest wprowadzający sekwencję kontrolną lub CSI. CSI Aoznacza przesunięcie kursora w górę o jedną kolumnę.

Jeśli chcesz zobaczyć kod ucieczki w terminalu, wpisz CTRL + V, a następnie inną sekwencję klawiszy. Na przykład CTRL + V, a następnie strzałka w górę pokazuje ^[[A.


0

Powłoka poleceń, na przykład Bash, jest programem, który tłumaczy strzałkę w górę na akcję „pobierz poprzednie polecenie”. Nie masz uruchomionej powłoki poleceń.


0

TLDR

Prawdopodobnie działasz, shco generuje nieprzetworzone kody wygenerowane po naciśnięciu klawisza strzałki w górę.

Bardziej zaawansowana powłoka jak bashprzechwytuje te kody i coś z nimi robi. Np. Pokaż ostatnie polecenie w historii.

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.