Ctrl + 4 отправляет ^ \
Терминалы отправляют символы (или, точнее, байты), а не ключи. При нажатии клавиши, представляющей печатный символ, терминал отправляет этот символ в приложение. Большинство функциональных клавиш кодируются как escape-последовательности: последовательности символов, начинающиеся с символа 27. Некоторые цепочки ключей вида Ctrl+ characterи несколько функциональных клавиш отправляются в качестве управляющих символов - в наборе символов ASCII , который используется всеми современными компьютерами. использовать в качестве основы (Unicode, ISO Latin- nи т. д. все являются надмножествами ASCII), 33 символа являются управляющими символами: символы с номерами от 0 до 31 и 127. Управляющие символы не могут быть напечатаны, но должны оказывать влияние на приложения; например, символ 10, который является Control-J (обычно пишется ^ J), является символом новой строки, поэтому, когда терминал отображает этот символ, он перемещает курсор на следующую строку, а не отображает глиф. Сам символ выхода является управляющим символом ^ [(значение 27).
Недостаточно управляющих символов, чтобы охватить все комбинации клавиш Ctrl+ character. Только буквы и символы @[\]^_?
имеют соответствующий управляющий символ. Когда вы нажимаете Ctrl+ 4или Ctrl+ $(что я предполагаю Ctrl+ Shift+ 4), терминал должен выбрать что-то для отправки. В зависимости от терминала и его конфигурации, есть несколько общих возможностей:
- Терминал игнорирует Ctrlмодификатор и отправляет символ
4
или $
.
- Терминал отправляет escape-последовательность, которая кодирует точную клавишу и модификаторы, которые были нажаты.
- Терминал отправляет какой-то другой управляющий символ.
Многие терминалы отправляют управляющие символы для некоторых клавиш в строке цифр:
- Ctrl+ 2→ ^ @
- Ctrl+ 3→ ^ [
- Ctrl+ 4→ ^ \
- Ctrl+ 5→ ^]
- Ctrl+ 6→ ^^
- Ctrl+ 7→ ^ _
- Ctrl+ 8→ ^?
Я не знаю, где возникло это соглашение.
Ctrl+ |отправляет тот же символ, потому что это Ctrl+ Shift+, \а терминал отправляет ^ \ независимо от того, была ли нажата клавиша Shift или нет.
^ \ выходит
Сам терминал (точнее, общая поддержка терминала в ядре) интерпретирует несколько управляющих символов специально. Эта интерпретация может быть настроена для отображения различных символов или отключена приложениями, которые хотят обрабатывать символы самостоятельно. Одна хорошо известная такая интерпретация заключается в том, что ^ M, символ, отправляемый Returnключом, отправляет текущую строку приложению, если терминал находится в режиме готового режима , в котором приложения получают строку за строкой.
Несколько символов отправляют сигналы в приложение на переднем плане. ^ C отправляет сигнал прерывания (SIGINT), который обычно говорит приложению прекратить то, что он делает, и прочитать следующую команду пользователя. Неинтерактивные приложения обычно выходят. ^ \ отправляет сигнал выхода (SIGQUIT), который обычно указывает приложению завершиться как можно скорее, не сохраняя ничего; многие приложения не переопределяют поведение по умолчанию, которое заключается в немедленном уничтожении приложения¹. Поэтому, когда вы нажимаете Ctrl+ 4(или все, что отправляет символ ^ \) в cat
или bc
, ни один из которых не отменяет поведение по умолчанию, приложение завершается.
Сам терминал печатает ^\
часть сообщения: это визуальное изображение введенного вами символа, и терминал находится в готовом режиме и с включенным эхом (символы отображаются терминалом, как только вы их набираете, в отличие от режим без эха, когда символы отправляются только в приложение, которое может или не может отображать их). Эта Quit
часть исходит от bash: он замечает, что его дочерний процесс умер от сигнала выхода, и это его способ сообщить вам.
Оболочки обрабатывают все распространенные сигналы, поэтому, если вы вводите ^ \ в оболочке, вы не убиваете сеанс, вы просто получаете новое приглашение, такое же как ^ C.
Вы можете играть с настройками терминала с помощью stty
команды.
¹ И традиционно генерировать дамп ядра , но многие системы в настоящее время отключают его по умолчанию.
less
илиvim
. Обратите внимание, что вcmd | less
,CTRL-C
обычно убиваетcmd
(в то время какless
это обрабатывается, чтобы отменить текущее действие (например, поиск)) (продолжение)В дополнение к ответу Жиля позвольте мне добавить, что вы всегда можете вводить непечатаемые символы в bash с помощью Ctrl-v+ key( в данном случае Ctrl-v+ Ctrl+4) и проверять код символа с помощью
Вы получите десятичный код символа, который, как вы можете проверить,
man ascii
соответствует разделителю файлов (FS) .источник
printf '%d\n' '"^\'
?