Управляющие символы Linux

При вводе с терминала управляющие символы (таблица ниже) служат командами драйверу терминала и в большинстве своем, генерируются при помощи сочетания клавиш 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) и необходимости «отдать команду на выполнение».

Нажатие клавиши ← 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 [email protected]

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:~$

 

Добавить комментарий