Терминалы
tty
Выводит имя терминала текущего пользователя. Обратите внимание: каждое отдельное окно xterm считается отдельным терминалом.
bash$ tty
/dev/pts/1
stty
Выводит и/или изменяет настройки терминала. Эта сложная команда используется в сценариях для управления поведением терминала.
Пример 13-1. Установка символа "забоя"
#!/bin/bash
# erase.sh: Использование команды "stty" для смены клавиши "забоя" при чтении ввода.
echo -n "Как Вас зовут? "
read name # Попробуйте стереть последние символы при вводе.
# Все работает.
echo "Вас зовут $name."
stty erase '#' # Теперь, чтобы стереть символ нужно использовать клавишу "#".
echo -n "Как Вас зовут? "
read name # Попробуйте стереть последние символы при вводе с помощью "#".
echo "Вас зовут $name."
exit 0
Пример 13-2. невидимый пароль: Отключение эхо-вывода на терминал
#!/bin/bash
echo
echo -n "Введите пароль "
read passwd
echo "Вы ввели пароль: $passwd"
echo -n "Если кто-нибудь в это время заглядывал Вам через плечо, "
echo "то теперь он знает Ваш пароль."
echo && echo # Две пустых строки через "and list".
stty -echo # Отключить эхо-вывод.
echo -n "Введите пароль еще раз "
read passwd
echo
echo "Вы ввели пароль: $passwd"
echo
stty echo # Восстановить эхо-вывод.
exit 0
Перехват нажатия на клавиши с помощью stty.
Пример 13-3.
#!/bin/bash
# keypress.sh: Определение нажатых клавиш.
echo
old_tty_settings=$(stty -g) # Сохранить прежние настройки.
stty -icanon
Keypress=$(head -c1) # или $(dd bs=1 count=1 2> /dev/null)
# для других, не GNU, систем
echo
echo "Была нажата клавиша \""$Keypress"\"."
echo
stty "$old_tty_settings" # Восстановить прежние настройки.
# Спасибо, Stephane Chazelas.
exit 0
См. также Пример 9-3.
терминалы и их режимы работы
Как правило, терминалы работают в каноническом режиме. Когда пользователь нажимает какую-либо клавишу, то соответствующий ей символ не сразу передается программе, исполняемой в окне терминала. Этот символ поступает сначала в локальный буфер терминала. Когда пользователь нажимает клавишу ENTER, то тогда все содержимое буфера передается программе.
bash$ stty -a
speed 9600 baud; rows 36; columns 96; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
...
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
В каноническом режиме можно использовать символы редактирования во время ввода.
bash$ cat > filexxx
wha<ctl-W>I<ctl-H>foo bar<ctl-U>hello world<ENTER>
<ctl-D>
bash$ cat filexxx
hello world
bash$ bash$ wc -c < file
13
Процесс в терминале получит только 13 символов (12 алфавитных символов и символ перевода строки), хотя пользователь нажал 26 клавиш.
В неканоническом ("сыром") режиме, каждая нажатая клавиша (включая специальные символы редактирования, такие как ctl-H) сразу же передается исполняющемуся в терминале процессу.
Под управлением Bash, базовый терминальный редактор заменяется более сложным терминальным редактором Bash. Например, если вы нажмете комбинацию клавиш ctl-A в командной строке Bash, то вы не увидите символов ^A, которые выводит терминал, вместо этого Bash получит символ \1, проанализирует его и переместит курсор в начало строки.
Stephane Chazelas
tset
Выводит или изменяет настройки терминала. Это более слабая версия stty.
bash$ tset -r
Terminal type is xterm-xfree86.
Kill is control-U (^U).
Interrupt is control-C (^C).
setserial
Настройка параметров последовательного порта. Эта команда должна запускаться пользователем, обладающим привилегиями root. Эту команду можно встретить в сценариях настройки системы.
# Взято из /etc/pcmcia/serial :
IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'`
setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ
getty, agetty
Программа getty или agetty запускается процессом init и обслуживает процедуру входа пользователя в систему. Эти команды не используются в сценариях.
mesg
Разрешает или запрещает доступ к терминалу текущего пользователя командой write.
Наверное это очень неприятно, когда, во время работы над текстовым файлом, в окне терминала, прямо среди текста, вдруг появляется предложение заказать пиццу. Поэтому, при работе в многопользовательской системе, вам наверняка захочется отключить доступ к своему терминалу.