При вводе с терминала управляющие символы (таблица ниже) служат командами драйверу терминала и в большинстве своем, генерируются при помощи сочетания клавиш Ctrl (отсюда ее название control — управление) с одной из алфавитно-цифровых клавиш. В отдельных случаях, управляющие символы генерируются специально предназначенными для этого клавишами, например, ↵ Enter, Tab или ← Backspace
Нотация | Ввод символа | Вывод символа | Клавиши | Код символа | Код символа |
^C | intr | — | Ctrl+C | 0x03 | ЕТХ |
^\ | quit | — | Ctrl+\ или Ctrl+4 | 0x1С | FS |
^Z | susp | — | Ctrl+Z | 0х1А | SUB |
^D | eof | — | Ctrl+D | 0x04 | EOT |
^? | erase | — | ← Backspace или Ctrl+? или Ctrl+8 | 0x7F | DEL |
^H или \b | — | backspace | Ctrl+H | 0x08 | BS |
^W | werase | — | Ctrl+W | 0x17 | ETB |
^U | kill | — | Ctrl+U | 0x15 | NAK |
^| или \t | — | tab | Tab или Ctrl+I | 0x09 | HT |
^M или \r | eol | cr | ↵ Enter или Ctrl+М | 0x0D | CR |
^J или \n | eol | nl | Ctrl+J | 0x0A | LF |
^S | stop | — | Ctrl+S | 0x13 | DC3 |
^Q | start | — | Ctrl+Q | 0x11 | DC1 |
^R | rprnt | — | Ctrl+R | 0x12 | DC2 |
^V | lnext | — | Ctrl+V | 0x16 | SYN |
^N | — | so | Ctrl+N | 0x0E | SO |
^O | — | si | Ctrl+O | 0x0F | SI |
^[ или \e | esc | esc | Esc или Ctrl+[ или Ctrl+3 | 0x1B | ESC |
Так, например, нажатие клавиши ↵ Enter или эквивалентное сочетание Ctrl+J, записывающееся как ^J, генерирует управляющий символ LF (таким же действием обладает символ CR, ^M), который сигнализирует драйверу терминала о завершении ввода строки (eol, end of line) и необходимости «отдать команду на выполнение».
Содержимое
Управляющие символы ^J и ^М
finn@ubuntu:~$ date ↵
Вс. февр. 1 22:39:00 MSK 2015
finn@ubuntu:~$ hostname ^M
ubuntu
finn@ubuntu:~$ whoami ^J
finn
Нажатие клавиши ← Backspace или сочетания клавиш Ctrl+? приводит к генерации управляющего символа DEL, что заставляет драйвер выполнить управляющее действие erase (^?) — удалить последний набранный символ. Аналогично, warese (^W) и kill (^U) удаляют последнее набранное слово и всю набранную строку соответственно.
Управляющие символы intr (^U) и quit (^\) — соответственно штатно и аварийно завершают запущенную ранее и выполняющуюся сейчас программу, а символ susp (^Z) временно приостанавливает выполняющуюся программу, что проиллюстрировано в следующем листинге.
Управляющие символы ^С и ^\
finn@ubuntu:~$ dd if=/dev/dvd of=dvd.iso
^C6227352+0 записей получено
6227351+0 записей отправлено
скопировано 3188403712 байт (3,2 GВ), 2,72618 с, 1,2 GB/c
finn@ubuntu:~$ dd if=/dev/cdrom of=cd.iso
^\выход (сделан дамп памяти)
Символы stop (^S) и start (^Q) управляют потоком вывода (и, как следствие, скроллингом терминала), что можно использовать для временной приостановки вывода команд с многострочным выводом. Однако случайное нажатие ^S может привести начинающего пользователя в замешательство— будет казаться, что терминал «завис», т. е. отсутствует реакция со стороны операционной системы на какие-либо нажимаемые клавиши и посылаемые символы, тогда как на самом деле отсутствует (приостановлен) лишь ее вывод— до нажатия ^Q, ^C или ^\.
Управляющий символ eof (^D) используется для оповещения драйвера о завершении ввода, при работе с интерактивными (ведущими с пользователем двусторонний попеременный диалог) программами.
Управляющий символ ^D
finn@ubuntu:~$ mail apetrov@gmail.com
Cc: ↵
Subject: Не забыть про Ctrl+D ↵
Символ ^D полезен для mail, at… где еще? ↵
^D
finn@ubuntu:~$ at 21:30
warning: commands will be executed using /bin/sh
at> mplayer ~/sounds/alarm.mp3 ↵
at> notify-send -i info ‘Хватит работать’ ↵
at> ^D <E0T>
job 4 at Sat Jan 31 21:30:00 2015
finn@ubuntu:~$ lftp ftp.ubuntu.com
lftp ftp.ubuntu.com:~> get /ubuntu/pool/main/n/manpages/manpages_3.74.orig.tar.xz ↵
291196 байтов перемещено за 7 секунд (22б.2Кб/с)
lftp ftp.ubuntu.com:/>^D exit
Нужно заметить, что при работе с диалоговыми программами ^C или ^\ завершит выполняющуюся программу (at), не дав ей выполнить свое основное действие, или вообще будет проигнорирован (ftp, mail). Именно символ завершения ввода (eof, end of file) сообщит драйверу о нежелании больше вести диалог с программой (которой в свою очередь сообщит программе об отсутствии для нее вводимых данных).
В очень «редких случаях, возможно, потребуется ввести сам управляющий символ, например ^С, ^\ или ^D, непосредственно в выполняющуюся на терминале программу, что цевйзможно «сделать соответствующими клавиатурными комбинациями, потому как управляющие символы будут поглощены драйвером терминала, что приведет к завершению программы, в которую вводятся символы. Для отмены (экранирования) специального назначения управляющих символов в пользу его непосредственного (литерального) значения служит управляющий символ (literal next) lnext (^V), сигнализирующий драйверу терминала об отмене специального назначения следующего за ним символа.
Управляющий символ ^V
finn@ubuntu:~$ tee cc.bin
Ctrl+C: ^C
finn@ubuntu:~$ od -ca cc.bin
0000000
finn@ubuntu:~$ tee cc.bin
Ctrl+C: ^V^C ↵
Ctrl+C:
^D
finn@ubuntu:~$ od -ca cc.bin
0000000 C t r l + C : 003 \n
C t r l + C : etx nl
finn@ubuntu:~$ hd cc.bin
00000000 43 74 72 6c 2b 43 3a 03 0a |Ctrl+C: |
00000009
Реакция драйвера терминала на получаемые управляющие символы и предпринимаемые им управляющие действия (а точнее, наоборот— управляющие символы, закрепленные за управляющими действиями) стандартно предопределена, но почти все эти соответствия могут быть просмотрены и изменены командой stty.
Утилита stty
finn@ubuntu:~$ stty -а
speed 38400 baud; rows 38; columns 136; line = 0;
intr = ^C; quit = ^\; erase = ^?; » kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^0; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Кроме того, команда stty позволяет получить (а также задать) и другие настройки драйвера терминала:
♦ скорость приемопередатчика последовательного интерфейса терминала
(speed 38400 baud);
♦ количество изображаемых терминалом строк и столбцов (rows 33; columns 119);
♦ флаги режимов работы приемопередатчика интерфейса (-parenb.. .hupcl -cstopb…-inpck);
♦ флаги режимов обработки вводимых из терминала символов (-istrip…-igncr icrnl…iutf8);
♦ флаги режимов обработки выводимых на терминал символов (opost…-ofdel) и пр.
Так, например, флаг icanon включает или выключает (-icanon) «канонический» (Canonical) режим обработки вводимых (input) символов, т. е. возможности редактирования вводимой строки при помощи управляющих символов ^? и ^U, а также сигнализацию завершения ввода при помощи ^D.
Флаг iexten включает «расширения» канонического режима стандарта POSIX, т. е. удаление последнего введенного слова при помощи ^W, перерисовку введенной строки при помощи ^R и ввод литеральных значений управляющих символов при помощи ^V.
Управляющие символы ^С, ^\ и ^Z штатного или аварийного завершения и приостановки выполняющейся программы активируются флагом isig, разрешающим или запрещающим (-isig) посылку сигналов (signal).
Флаг icrnl включает трансляцию вводимого символа CR в символ LF, что позволяет запускать команды клавишей ↵ Enter (неожиданно, правда?), потому как основной символ для этого действия авсе же— LF (так уж сложилось в UNIX со времен телетайпа ASR-33).
К счастью, большинство из этих параметров и флагов применимы только при работе с настоящими аппаратными терминалами и интерфейсами. Поэтому пояснение их назначения можно опустить хотя бы просто пртому, что оно требует дополнительных знаний специфики соответствующей аппаратуры, что не имеет ни особой актуальности.
Нужно также отметить, что некоторые диалоговые программы «игнорируют» некоторые настройки терминала, например флаг «канонического» режима. Точнее, они всегда работают в «неканоническом» режиме и сами обрабатывают управляющие символы, зачастую переопределяя некоторые из них или добавляя обработку дополнительных, например, для командного интерпретатора bash(1) это ^R (reverse-search-history), ^S (forward-search-history), ^D (delete-char) ^L (clear-screen), ^A (beginning-of-line), ^E (end-of-line), ^F(forward-char) , ^B (backward-char), ^P (previous-history), ^N (next-history) и др.
Настройки драйвера терминала
finn@ubuntu:~$ stty
speed 38400 baud; line = 0;
iutf8
ftnn@ubuntu:~$ stty -isig
finn@uburrtu:~$ stty
speed 38460 baud; line = 0;
iutf8
-isig
finn@ubuntu:~$ dd if=/dev/dvd of=dvd.iso
^С^\^Z
При выводе информации ид терминал, управляющие символы (в отличие от алфавитно-цифровых символов, подлежащих изображению каким-либо значком) служат для управления терминалом (ascii, console_codes). Например, символ CR (carriage return) перемещает печатающую головку или курсор терминала в начало строки, символ LF (line feed)— в начало новой строки, символ NL (nl, new fine) — на следующую строку, символ HT (horizontal tab)— на несколько символов вправо, а символ BS (back space) стирает один символ слева от курсора (или просто перемещает печатающую головку на один символ влево) и т. д.
Так, символ LF, используемый в «текстовых» файлах при выводе их на экран, позволяет разделять «логические» строки файла и изображать их на разных «физических» строках терминала, а символы SO (shift out) и SI (shift in) соответственно включают , и выключает альтернативный шрифт тефмйнала, содержащий другие знаки вместо маленьких букв латинского алфавита. Именно поэтому при ошибочном выводе на терминал «бинарного» файла, в содержимом которого весьма вероятно встретить символ SO, активирующий альтернативный шрифт, возникает ощущение «испорченности» терминала, которую легко починить выводом символа SI, возвращающего терминал к стандартному шрифту. Для этого достаточно литерально ввести символ SI, который будет расценен командным интерпретатором как (несуществующая) команда и выведен на экран в сообщении об ошибке.
Управляющие символы SO (^N) и SI (^O)
finn@ubuntu:~$ cat /etc/localtime
… …
#<#(1#Х?|
*8@FP *8@8*@! 8@8@LMTMMTMSTMDSTMSKMSDMSMEETEEST,
MSK↑4
•l+WH+H :~$^V^O
: команда не найдена
finn@ubuntu:~$ tee si-and-so.txt
hahaha^\^N+hahaha^V^O
hahaha***b
finn@ubuntu:~$