stty
Команда stty (строковый тип) является одним из самых мощных инструментов настройки поведения терминала в Unix‑подобных системах. С её помощью можно менять скорость передачи, включать или отключать специальные режимы ввода/вывода, управлять обработкой сигналов и даже конфигурировать последовательные порты. Ниже мы подробно разберём основные возможности команды, покажем практические примеры и объясним, как правильно применять её в реальных задачах.
1. Основные принципы работы stty
1.1 Формат командной строки
Команда принимает два типа аргументов:
| Тип | Описание |
|---|---|
Флаги (-a, -g, -t, …) | Отображают текущие настройки терминала в человекочитаемом или машинном формате. |
Установки (speed 9600, raw, echo, isig) | Устанавливают конкретные параметры, например скорость, режимы ввода/вывода и обработку сигналов. |
1.2 Режимы терминала
stty управляет четырьмя ключевыми группами режимов:
| Группа | Описание |
|---|---|
Input (ignbrk, brkint, icrnl, …) | Как обрабатываются входные байты. |
Output (onlcr, ocrnl, …) | Модификации выходных данных, например перевод строки в CRLF. |
Control (isig, icanon, iexten) | Управление сигналами (SIGINT, SIGQUIT), каноническим режимом ввода и расширенными функциями. |
Local (echo, echok, echoe) | Отображение символов, вывод сообщения об ошибке и т.д. |
1.3 Пример чтения текущих настроек
$ stty -a
speed 38400 baud; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U;
eof = ^D; eol = <undef>; eol2 = <undef>;
swab; start = ^Q; stop = ^S; susp = ^Z;
rprnt; werase; lnext = ^V; flush = ^O;
tostop; -icanon; echo; -echoe; -echok;
isig; -iexten; -parenb; cs8; -cstopb; hupcl;Вывод показывает все текущие параметры, которые можно менять с помощью stty.
2. Практические применения
2.1 Установка скорости терминала
Скорость порта (baud rate) задаётся как числом, так и флагом:
# Пример: установить скорость на 115200 бод
$ stty -F /dev/ttyUSB0 115200
# Синтаксис для стандартного терминала:
$ stty 9600При работе с последовательными устройствами важно убедиться, что выбранный порт поддерживает нужную скорость. Если порт не отвечает, можно проверить его состояние через dmesg или ls /dev/tty*.
2.2 Включение канонического режима и сигналов
Канонический режим (icanon) позволяет обрабатывать ввод как строки, завершающиеся переводом строки. Отключив его, вы получите raw mode, где каждый байт передаётся сразу:
# Канонический режим + сигналы (по умолчанию)
$ stty sane
# Raw mode без сигналов и отступов
$ stty raw -echo2.2.1 Управление сигналами
Флаг isig разрешает генерацию сигналов по специальным символам (^C, ^Z). Отключив его, можно подавлять эти сигналы:
$ stty -isig # отключить SIGINT и SIGQUIT2.3 Перенос строк в выходных данных
Флаги onlcr и ocrnl отвечают за преобразование символов переноса строки (\n) в комбинацию возврата каретки + перевода строки (CRLF). Это полезно при работе с устройствами, ожидающими Windows‑стиль:
# Пример: включить преобразование NL → CRNL
$ stty onlcr
# Отключить
$ stty -onlcr2.4 Управление символами управления
Вы можете переопределять специальные клавиши, например изменить erase с ^? на ^H:
$ stty erase ^HЭто удобно в скриптах, где ожидается определённый набор управляющих последовательностей.
2.5 Конфигурация последовательных портов
При работе с UART‑устройствами stty позволяет задавать параметры как паритет (parenb, parodd), длину данных (cs7, cs8) и стоповые биты (cstopb). Пример:
# 8N1 (8 бит, без паритета, один стоповый бит)
$ stty -F /dev/ttyS0 cs8 -parenb -cstopb
# 7E2 (7 бит, четный паритет, два стоповых бита)
$ stty -F /dev/ttyS1 cs7 parodd cstopb3. Использование stty в скриптах
3.1 Сохранение и восстановление настроек
Перед изменением терминальных параметров полезно сохранить текущие настройки, а затем вернуть их после завершения задачи:
#!/bin/bash
# Сохраняем состояние терминала
OLDSTTY=$(stty -g)
# Включаем raw mode для чтения байтов по одному
stty raw -echo
# Читаем ввод пользователя до Ctrl+C
while read -n1 key; do
echo "Нажата клавиша: $key"
done
# Восстанавливаем исходные настройки
stty "$OLDSTTY"3.2 Автоматическая настройка последовательного порта
Для автоматической конфигурации можно создать функцию:
configure_port() {
local port=$1
local speed=$2
stty -F "$port" $speed cs8 -parenb -cstopb -crtscts
}Вызывайте её с нужными параметрами: configure_port /dev/ttyUSB0 9600.
3.3 Проверка ошибок и диагностика
Команда stty -a возвращает все флаги в текстовом виде, что позволяет быстро убедиться, что параметры заданы корректно. Если при работе с устройством возникает ошибка «Broken pipe», проверьте наличие флага crtscts (контрольный сигнал RTS/CTS) и включите его при необходимости.
4. Советы по эффективному использованию
- Избегайте конфликтов – если несколько программ одновременно используют один терминал, их настройки могут перекрываться. Используйте отдельные виртуальные терминалы (
ttyS0,ttyS1) или сокрытие конфигурации черезstty -F. - Проверяйте права доступа – для работы с
/dev/tty*требуется соответствующий уровень прав (обычно принадлежность группыdialout). Если доступ запрещён, используйтеsudoили меняйте группу пользователя. - Оптимизируйте производительность – в raw mode отключите
echo, чтобы уменьшить задержку при чтении данных с последовательного порта. - Документируйте изменения – добавляйте комментарии в скрипты, поясняющие назначение каждой настройки
stty. Это поможет коллегам быстро понять логику работы.
Команда sttty — это мощный инструмент для точной настройки терминальных устройств и последовательных портов. С его помощью можно добиться максимальной совместимости с различными устройствами, улучшить пользовательский ввод и управлять передачей данных на низком уровне. Используйте приведённые рекомендации и примеры, чтобы эффективно интегрировать stty в свои рабочие процессы.