Ctrl + 4 wysyła ^ \
Terminale wysyłają znaki (a ściślej bajty), a nie klucze. Po naciśnięciu klawisza reprezentującego znak, który można wydrukować, terminal wysyła ten znak do aplikacji. Większość klawiszy funkcyjnych jest zakodowanych jako sekwencje specjalne: sekwencje znaków rozpoczynające się od znaku 27. Niektóre słowa kluczowe postaci Ctrl+ characteri kilka klawiszy funkcyjnych są wysyłane jako znaki kontrolne - w zestawie znaków ASCII , który wszystkie współczesne komputery używać jako podstawy (Unicode, ISO Latin- n, itd. to nadzbiory ASCII), 33 znaki to znaki sterujące: znaki od 0 do 31 i 127. Znaki sterujące nie są drukowalne, ale mają na celu działanie w aplikacjach; na przykład znak 10, którym jest Control-J (zwykle zapisywany ^ J), jest znakiem nowego wiersza, więc gdy terminal wyświetla ten znak, przesuwa kursor do następnego wiersza, zamiast wyświetlać glif. Sam znak zmiany znaczenia jest znakiem kontrolnym ^ [(wartość 27).
Nie ma wystarczającej liczby znaków kontrolnych, aby zakryć wszystkie Ctrl+ słowa characterkluczowe. Tylko litery i znaki @[\]^_?
mają odpowiedni znak kontrolny. Kiedy naciśniesz Ctrl+ 4lub Ctrl+ $(który, jak zakładam, to Ctrl+ Shift+ 4), terminal musi wybrać coś do wysłania. W zależności od terminala i jego konfiguracji istnieje kilka typowych możliwości:
- Terminal ignoruje Ctrlmodyfikator i wysyła znak
4
lub $
.
- Terminal wysyła sekwencję zmiany znaczenia, która koduje dokładnie wciśnięty klawisz i modyfikatory.
- Terminal wysyła inny znak sterujący.
Wiele terminali wysyła znaki sterujące dla niektórych kluczy w wierszu cyfr:
- Ctrl+ 2→ ^ @
- Ctrl+ 3→ ^ [
- Ctrl+ 4→ ^ \
- Ctrl+ 5→ ^]
- Ctrl+ 6→ ^^
- Ctrl+ 7→ ^ _
- Ctrl+ 8→ ^?
Nie wiem, gdzie powstała ta konkretna konwencja.
Ctrl+ |wysyła ten sam znak, ponieważ jest Ctrl+ Shift+, \a terminal wysyła ^ \ niezależnie od tego, czy naciśnięto klawisz Shift, czy nie.
^ \ kończy pracę
Sam terminal (a dokładniej ogólna obsługa terminala w jądrze) interpretuje specjalnie kilka znaków kontrolnych. Ta interpretacja może być skonfigurowana do mapowania różnych znaków lub wyłączona przez aplikacje, które same chcą przetwarzać znaki. Jedną z dobrze znanych takich interpretacji jest to, że ^ M, znak wysyłany za pomocą Returnklawisza, wysyła bieżącą linię do aplikacji, jeśli terminal jest w trybie gotowania , w którym aplikacje odbierają wejście linia po linii.
Kilka znaków wysyła sygnały do aplikacji na pierwszym planie. ^ C wysyła sygnał przerwania (SIGINT), który konwencjonalnie nakazuje aplikacji zatrzymać pracę i przeczytać następne polecenie użytkownika. Nieinteraktywne aplikacje zwykle zamykają się. ^ \ wysyła sygnał wyjścia (SIGQUIT), który konwencjonalnie nakazuje aplikacji zakończenie pracy tak szybko, jak to możliwe, bez zapisywania czegokolwiek; wiele aplikacji nie zastępuje domyślnego zachowania, które polega na natychmiastowym zabiciu aplikacji¹. Więc kiedy naciśniesz Ctrl+ 4(lub cokolwiek, co wysyła znak ^ \) w cat
lub bc
, z których żadne nie zastępuje domyślnego zachowania, aplikacja zostanie zabita.
Sam terminal drukuje ^\
część wiadomości: jest to wizualne przedstawienie wpisanego znaku, a terminal jest w trybie gotowym i włączonym echo (znaki są wyświetlane przez terminal zaraz po ich wpisaniu, w przeciwieństwie do tryb bez echa, w którym znaki są wysyłane tylko do aplikacji, która może, ale nie musi, wyświetlać je). Quit
Część pochodzi z bash: to zauważy, że proces jej dziecko zmarło od A wyjść sygnału, a to jest jego sposób powiadomieniem.
Powłoki obsługują wszystkie popularne sygnały, więc jeśli wpiszesz ^ \ w powłoce, nie zabijesz sesji, po prostu pojawi się nowy monit, podobnie jak ^ C.
Możesz grać z ustawieniami terminala za pomocą stty
polecenia.
¹ Tradycyjnie generuje zrzut pamięci , ale obecnie wiele systemów domyślnie go wyłącza.
less
lubvim
. Zauważ, że wcmd | less
, naCTRL-C
ogół zabijacmd
(podczasless
gdy jest obsługiwane, aby anulować bieżącą akcję (jak wyszukiwanie)) (ciąg dalszy)Oprócz odpowiedzi Gilles pozwól mi dodać, że zawsze możesz wpisać znaki niedrukowalne za pomocą Ctrl-v+ key( Ctrl-v+ Ctrl+4w tym przypadku + ) i sprawdzić kod znaku za pomocą
otrzymasz kod dziesiętny znaku, który jak możesz się wpisać
man ascii
odpowiada separatorowi plików (FS) .źródło
printf '%d\n' '"^\'
:?