stty

Команда stty (строковый тип) является одним из самых мощных инструментов настройки поведения терминала в Unix‑подобных системах. С её помощью можно менять скорость передачи, включать или отключать специальные режимы ввода/вывода, управлять обработкой сигналов и даже конфигурировать последовательные порты. Ниже мы подробно разберём основные возможности команды, покажем практические примеры и объясним, как правильно применять её в реальных задачах.

1. Основные принципы работы stty

1.1 Формат командной строки

Команда принимает два типа аргументов:

ТипОписание
Флаги (-a-g-t, …)Отображают текущие настройки терминала в человекочитаемом или машинном формате.
Установки (speed 9600rawechoisig)Устанавливают конкретные параметры, например скорость, режимы ввода/вывода и обработку сигналов.

1.2 Режимы терминала

stty управляет четырьмя ключевыми группами режимов:

ГруппаОписание
Input (ignbrkbrkinticrnl, …)Как обрабатываются входные байты.
Output (onlcrocrnl, …)Модификации выходных данных, например перевод строки в CRLF.
Control (isigicanoniexten)Управление сигналами (SIGINT, SIGQUIT), каноническим режимом ввода и расширенными функциями.
Local (echoechokechoe)Отображение символов, вывод сообщения об ошибке и т.д.

1.3 Пример чтения текущих настроек

Bash
$ 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) задаётся как числом, так и флагом:

Bash
# Пример: установить скорость на 115200 бод
$ stty -F /dev/ttyUSB0 115200

# Синтаксис для стандартного терминала:
$ stty 9600

При работе с последовательными устройствами важно убедиться, что выбранный порт поддерживает нужную скорость. Если порт не отвечает, можно проверить его состояние через dmesg или ls /dev/tty*.

2.2 Включение канонического режима и сигналов

Канонический режим (icanon) позволяет обрабатывать ввод как строки, завершающиеся переводом строки. Отключив его, вы получите raw mode, где каждый байт передаётся сразу:

Bash
# Канонический режим + сигналы (по умолчанию)
$ stty sane

# Raw mode без сигналов и отступов
$ stty raw -echo

2.2.1 Управление сигналами

Флаг isig разрешает генерацию сигналов по специальным символам (^C, ^Z). Отключив его, можно подавлять эти сигналы:

Bash
$ stty -isig   # отключить SIGINT и SIGQUIT

2.3 Перенос строк в выходных данных

Флаги onlcr и ocrnl отвечают за преобразование символов переноса строки (\n) в комбинацию возврата каретки + перевода строки (CRLF). Это полезно при работе с устройствами, ожидающими Windows‑стиль:

Bash
# Пример: включить преобразование NL → CRNL
$ stty onlcr

# Отключить
$ stty -onlcr

2.4 Управление символами управления

Вы можете переопределять специальные клавиши, например изменить erase с ^? на ^H:

Bash
$ stty erase ^H

Это удобно в скриптах, где ожидается определённый набор управляющих последовательностей.

2.5 Конфигурация последовательных портов

При работе с UART‑устройствами stty позволяет задавать параметры как паритет (parenb, parodd), длину данных (cs7, cs8) и стоповые биты (cstopb). Пример:

Bash
# 8N1 (8 бит, без паритета, один стоповый бит)
$ stty -F /dev/ttyS0 cs8 -parenb -cstopb

# 7E2 (7 бит, четный паритет, два стоповых бита)
$ stty -F /dev/ttyS1 cs7 parodd cstopb

3. Использование stty в скриптах

3.1 Сохранение и восстановление настроек

Перед изменением терминальных параметров полезно сохранить текущие настройки, а затем вернуть их после завершения задачи:

Bash
#!/bin/bash
# Сохраняем состояние терминала
OLDSTTY=$(stty -g)

# Включаем raw mode для чтения байтов по одному
stty raw -echo

# Читаем ввод пользователя до Ctrl+C
while read -n1 key; do
    echo "Нажата клавиша: $key"
done

# Восстанавливаем исходные настройки
stty "$OLDSTTY"

3.2 Автоматическая настройка последовательного порта

Для автоматической конфигурации можно создать функцию:

Bash
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. Советы по эффективному использованию

  1. Избегайте конфликтов – если несколько программ одновременно используют один терминал, их настройки могут перекрываться. Используйте отдельные виртуальные терминалы (ttyS0ttyS1) или сокрытие конфигурации через stty -F.
  2. Проверяйте права доступа – для работы с /dev/tty* требуется соответствующий уровень прав (обычно принадлежность группы dialout). Если доступ запрещён, используйте sudo или меняйте группу пользователя.
  3. Оптимизируйте производительность – в raw mode отключите echo, чтобы уменьшить задержку при чтении данных с последовательного порта.
  4. Документируйте изменения – добавляйте комментарии в скрипты, поясняющие назначение каждой настройки stty. Это поможет коллегам быстро понять логику работы.

Команда sttty — это мощный инструмент для точной настройки терминальных устройств и последовательных портов. С его помощью можно добиться максимальной совместимости с различными устройствами, улучшить пользовательский ввод и управлять передачей данных на низком уровне. Используйте приведённые рекомендации и примеры, чтобы эффективно интегрировать stty в свои рабочие процессы.