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 ^[[A
jakieś postacie sugerują coś?
getty
lublogin
, 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.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
A
zamiast tego przesyła do aplikacjia
.Ponadto niektóre klawisze funkcyjne mogą nie być mapowane w konsoli.
Aby zobaczyć podobny widok w GUI, zobacz Co to jest meta-klucz bash?
źródło
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.
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:
A
jeśli klawisz Shift jest wciśnięty (lub Shift Lock), wa
przeciwnym razie.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 toescape-[-B, C, D
.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
curses
biblioteka porusza kursorem), alebash
przechwytują go i przewijają historię.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 odpowiadacontrol-[
). Jest to faktycznie obsługiwane przez interfejs urządzenia końcowego; zobstty(1)
. W rezultacie strzałka w górę pojawi się jako^[[A
. Zobaczysz to z wiersza poleceń, jeśli wpiszeszcat
, 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
/A
Przykł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).źródło
To zachowanie różni się od powłoki do powłoki. Większość powłok używa biblioteki wywoływanej
readline
do edycji linii w wierszu poleceń. Oto pełnereadline
zestawienie 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
^[[A
i^[[B
są drukowane na ekranie. Co to^[[A
znaczy?Strona podręcznika bash mówi pod
PROMPTING
:Te sekwencje specjalne dla klawiszy strzałek w ANSI to:
[ValueA
Kursor w górę (gdzieValue
może być pusty)[ValueB
Kursor w dół (gdzieValue
może być pusty)źródło
login
, co nie jest powiązanebash
.bash
ilogin
używają tej samej biblioteki (readline) do edycji linii. Różnica polega na tym,login
że nie interpretują klawiszy strzałek pionowych jako polecenia, podobnie jakbash
robi.^[
reprezentacjaescape
, 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
.Są to kody ucieczki ANSI .
^[
to notacja używana przez powłokę do wyświetlaniaESC
bajtu (bajt 27 ASCII). Zatem twoim przykładem jest bajt ESC, po którym następuje tekst[A
. Jak widać w artykule w Wikipedii,^[[
(ESC
po nim[
) jest wprowadzający sekwencję kontrolną lub CSI.CSI A
oznacza 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
.źródło
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ń.
źródło
TLDR
Prawdopodobnie działasz,
sh
co generuje nieprzetworzone kody wygenerowane po naciśnięciu klawisza strzałki w górę.Bardziej zaawansowana powłoka jak
bash
przechwytuje te kody i coś z nimi robi. Np. Pokaż ostatnie polecenie w historii.źródło