Гид по технологиям

Команда read в Linux: руководство и примеры

• 8 min read • Linux • Обновлено 29 Nov 2025
Команда read в Linux — руководство и примеры
Команда read в Linux — руководство и примеры

Изображение: терминал с подсказкой ввода и командой read

Содержание

  • Что такое команда read
  • Опции команды read
  • Как читать ввод с помощью read
  • Чтение нескольких значений
  • Чтение из файла
  • Чтение в цикле
  • Подсказки перед вводом
  • Ограничение длины ввода
  • Разделение полей с помощью IFS
  • Таймаут при чтении
  • Скрытый ввод (например, пароли)
  • Частые ошибки и когда read не сработает
  • Альтернативные подходы
  • Быстрая шпаргалка (cheat sheet)
  • Эвристики и роль‑ориентированные чек‑листы
  • Краткий словарь терминов
  • Итоги

Что такое команда read

Команда read — это встроенная (builtin) команда POSIX‑совместимых оболочек (например, bash, dash, sh), которая читает одну строку из стандартного ввода (stdin) или указанного файлового дескриптора и сохраняет разобранные поля в заданные переменные. Если имена переменных не указаны, результат сохраняется в переменной REPLY.

Определение в одну строку: read читает ввод, разбивает по разделителям и помещает части в переменные.

Синтаксис (обобщённый):

read [опции] [имя_переменной ...]

Если чтение прошло успешно, команда возвращает код 0; при достижении конца файла — ненулевой код (обычно 1). Поведение может отличаться в разных оболочках, поэтому при необходимости проверяйте документацию вашей оболочки с помощью help read.

Примечание: в bash команда read — встроенная. Чтобы увидеть краткую справку в bash, используйте:

help read

Опции команды read

Ниже — распространённые опции bash read с описанием. Они часто используются в скриптах для интерактивного ввода или парсинга строк.

ОпцияОписание
-aСохраняет поля в массив (например, массив=())
-sТихий режим: ввод не отображается в терминале (полезно для паролей)
-eВключает поддержку readline (строка редактируется, стрелки работают)
-iЗадаёт предварительное значение при использовании -e (начальное содержимое линии)
-pОтображает указанную подсказку перед чтением
-uЧитает не из stdin, а из указанного файлового дескриптора (число)
-dИспользует заданный символ как разделитель строки вместо \n
-tУстанавливает таймаут в секундах; если время истёкло — read завершится с ошибкой
-rНе обрабатывает обратные косые черты как escape-символы
-nЧитает только указанное количество символов

Важно: поведение флагов может незначительно отличаться между оболочками (bash, zsh, dash). Опция -i работает только совместно с -e.

Как читать ввод с помощью read

Самый простой случай — вызвать read без аргументов. Тогда ввод сохраняется в переменной REPLY:

read
# ввод пользователя: hello
# результат: REPLY содержит "hello"
echo "$REPLY"

Чтобы сохранить ввод в конкретную переменную, укажите её имя:

read username
# ввод: alice
echo "$username"

Если нужно задать подсказку (prompt), используйте -p:

read -p "Введите имя: " name
echo "Привет, $name!"

Чтение нескольких значений

read может разделять введённую строку на слова и помещать их в несколько переменных. По умолчанию разделителями являются символы, указанные в IFS (пробел, таб, перевод строки).

read first second third
# ввод: one two three four five
# результат: first=one, second=two, third="three four five"

Последняя переменная получает всё, что осталось от строки.

Важная заметка: если в строке недостаточно слов, лишние переменные останутся пустыми.

Чтение из файла

Частая паттерн‑задача — читать файл построчно:

while IFS= read -r line; do
  echo "Строка: $line"
done < samplefile.txt

Пояснения:

  • IFS= перед read предотвращает обрезку начальных/конечных пробелов;
  • опция -r выключает обработку backslash как escape, что полезно для корректного чтения строк с .

Построчное чтение файла в терминале

Чтение в цикле от пользователя

Чтобы собирать ввод в цикле, используйте конструкцию с while:

while read -r line; do
  echo "Ввод: $line"
done

Цикл завершится при получении EOF (Ctrl+D) или если скрипт прервут.

Циклический ввод пользователя

Подсказки перед вводом

Параметр -p удобен для создания интерактивных подсказок:

read -p "Введите ваше имя: " name

Если хотите использовать автодополнение или перемещение по строке (стрелки), включите readline через -e и при необходимости задайте -i:

read -e -i "default" -p "Опция (по умолчанию default): " opt

Ограничение длины ввода

Флаг -n ограничивает количество символов, которые может ввести пользователь. Число указывает точное число символов для чтения:

read -n 4 code
# пользователь вводит до 4 символов; после ввода 4 символов read завершается

Если нужно дождаться нажатия Enter, используйте -n совместно с другими проверками или обрабатывайте ввод отдельно.

Разделение полей с помощью IFS

Переменная IFS (Internal Field Separator) определяет набор символов, которыми read разбивает строку на поля. По умолчанию это пробел, таб и перевод строки.

Пример, когда данные разделены двоеточием:

IFS=':' read -r name password rest
echo "Name: $name, Password: $password"

После выполнения такой команды первым полем станет всё до первого :, вторым — между первым и вторым :, а оставшееся попадёт в rest.

Использование IFS для разделения полей

Важно: не забывайте временно менять IFS локально (например, в подкоманде или перед read) чтобы не повредить глобальное поведение скрипта.

Таймаут при чтении

Опция -t задаёт таймаут в секундах. Если пользователь ничего не ввёл за это время, read завершится с ненулевым кодом возврата.

if read -t 10 -p "Введите имя (10 с): " name; then
  echo "Привет, $name"
else
  echo "Время ожидания истекло"
fi

Если вам нужен таймаут с дробями секунд, в bash 5+ поддерживается дробный таймаут (например, 0.5), но в системах со старыми версиями bash дробные секунды могут не работать.

Скрытый ввод (пароли и секреты)

Чтобы ввод не отображался в терминале (например, при вводе пароля), используйте -s:

read -s -p "Введите пароль: " password
echo "\nПароль сохранён"

Не выводите пароль в логах и не храните его в незашифрованных файлах. После использования переменной желательно её очищать:

unset password

Частые ошибки и когда read не сработает

  • read как builtin работает в текущей оболочке. Если вы запускаете скрипт в подпроцессе (например, через | while read …), изменения переменных внутри цикла могут не отразиться снаружи. В bash используйте process substitution (< <(cmd)) или перенаправление файла.

  • read не подходит для чтения двоичных данных; он рассчитан на строки текста.

  • Некорректное использование IFS может привести к потере пробелов в начале/конце строки. Чтобы сохранить пробелы, выставляйте IFS=’’ при чтении.

  • Опция -i доступна только при включённом readline (-e) и не поддерживается в некоторых оболочках.

  • Если вы используете read внутри функции и хотите, чтобы переменная была глобальной, следите за областью видимости: в bash переменные по умолчанию глобальные, но использование local изменит поведение.

  • В некоторых версиях оболочки дробный таймаут (-t 0.5) недоступен.

Альтернативные подходы

  • Использовать команду read только для интерактивного ввода; для парсинга файлов лучше применять awk, sed или while IFS= read -r.

  • Для сложных интерактивных форм и валидации рассмотрите использование dialog или whiptail (TUI) или библиотек на Python/Perl с readline/Prompt Toolkit.

  • Для передачи секретов используйте утилиты управления секретами (например, pass, HashiCorp Vault) вместо хранения паролей в переменных окружения.

  • Если нужно асинхронно ожидать ввода и обрабатывать сигналы — создавайте фоновые процессы и используйте named pipes (FIFO) или сокеты.

Быстрая шпаргалка (cheat sheet)

  • Чтение в переменную: read var
  • Подсказка: read -p “Prompt: “ var
  • Тихий ввод (пароль): read -s -p “Password: “ pw
  • Ограничение символов: read -n 1 key
  • Таймаут: read -t 5 var
  • Массив: read -a arr
  • Не интерпретировать backslash: read -r line
  • Чтение из дескриптора: read -u 3 line

Пример: построчное чтение с сохранением пробелов:

while IFS= read -r line; do
  printf '%s\n' "$line"
done < file.txt

Эвристики и практические правила

  • Всегда используйте -r при чтении файлов, чтобы избежать неожиданной обработки обратных слэшей.
  • Если ожидаете сохранение пробелов в начале/конце, выставьте IFS=’’.
  • Для ввода пароля применяйте -s и сразу же очищайте переменную.
  • Для совместимости со старыми оболочками проверяйте доступность опций (особенно -i и дробных значений в -t).

Роль‑ориентированные чек‑листы

Для разработчика-скриптера:

  • Использовать read -r для файлов.
  • Оборачивать изменение IFS локально.
  • Обрабатывать коды возврата read.

Для администратора, пишущего интерактивные скрипты:

  • Предусмотреть таймауты (-t).
  • Не логировать секреты.
  • Добавлять понятные подсказки (-p) и значения по умолчанию (-e -i).

Для тестировщика:

  • Проверить поведение при пустом вводе, EOF и превышении таймаута.
  • Тестировать в разных оболочках (bash, dash, zsh) при необходимости.

Краткий словарь терминов

  • stdin: стандартный ввод — поток, откуда читаются данные (обычно клавиатура).
  • IFS: Internal Field Separator — набор символов для разделения полей.
  • EOF: End Of File — сигнал конца ввода (Ctrl+D в терминале).
  • builtin: встроенная команда оболочки, выполняющаяся в процессе оболочки.

Примеры шаблонов и тестовые сценарии

Шаблон: чтение выбора с валидацией и таймаутом

read_with_default() {
  local prompt="$1" default="$2" timeout="${3:-10}" result
  if read -t "$timeout" -e -i "$default" -p "$prompt" result; then
    echo "$result"
  else
    echo "$default"
  fi
}

choice=$(read_with_default "Выберите режим: " "auto" 5)
echo "Режим: $choice"

Тесты приёмки (acceptance):

  • Сценарий 1: Ввод валидного значения — переменная содержит введённое.
  • Сценарий 2: Нажатие Ctrl+D — read возвращает ненулевой код.
  • Сценарий 3: Таймаут — при -t read завершается и возвращает ненулевой код.
  • Сценарий 4: Ограничение -n — при вводе более N символов read завершается после N.

Когда использовать read, а когда нет

Используйте read когда:

  • Нужно прочитать короткую строку или поле из stdin;
  • Нужен простой интерактивный ввод в shell‑скрипте.

Не используйте read когда:

  • Требуется сложная форма с проверками и автодополнением — используйте внешние инструменты или языки с поддержкой интерактивных библиотек;
  • Нужно парсить произвольные двоичные потоки.

Итоги

Команда read — надёжный инструмент для интерактивного ввода и простого парсинга строк в shell‑скриптах. Зная основные опции (-r, -p, -s, -t, -n, -a, -u, -d, -e, -i) и правила работы с IFS, вы сможете безопасно и удобно принимать данные от пользователя и из файлов.

Важно: тестируйте скрипты в целевой оболочке и аккуратно обращайтесь с секретами и побочными эффектами (области видимости, изменение IFS).

Image credit: Gabriel Heinzer via Unsplash. Все скриншоты — Haroon Javed.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро