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

Содержание
- Что такое команда 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 локально (например, в подкоманде или перед 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.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента