Перенаправление ввода/вывода в Linux
В Linux существует четыре стандартных потока ввода/вывода данных.
- Первый поток — stdin(0) — это стандартный поток ввода (standard input). В системе это — поток 0. Обычно данные в этот поток попадают в ходе ввода их с клавиатуры.
- Второй поток — stdout(1) — это стандартный поток вывода (standard output), ему присвоен номер 1. Это поток данных, которые оболочка выводит после выполнения каких-то действий, т.е. экран терминала.
- Третий поток — stderr(2) — это стандартный поток ошибок (standard error), он имеет дескриптор 2. Нечто вроде стандартного потока вывода, так как обычно то, что в него попадает, оказывается на экране терминала.
- Четвёртый поток — FD(n) — файловый дескриптор, ссылка на ресурс ввода/вывода. Проще говоря, вместо клавиатуры и экрана можно использовать файл для ввода/вывода данных.
Базовые перенаправления
gentoo ~ # cmd < file# Чтение ввода из файла вместо клавиатуры
gentoo ~ # cmd > file# Вывод stdout в файл (перезаписывает файл)
gentoo ~ # cmd >> file# Дописывание stdout в файл (создаёт его, если он не существует)
gentoo ~ # cmd > file# Вывод stdout в файл (перезаписывает файл)
gentoo ~ # cmd >> file# Дописывание stdout в файл (создаёт его, если он не существует)
где cmd — любая команда.
Перенаправление потока ошибок
Когда нужно, чтобы ошибки не смешивались с полезными данными.
gentoo ~ # cmd 2> file# Вывод stderr в файл (перезаписывает файл)
gentoo ~ # cmd 2>> file# Дописывание stderr в файл (создаёт его, если он не существует)
gentoo ~ # cmd 2>&1 file# Перенаправление stderr в тот же поток, что и stdout
gentoo ~ # cmd 2>> file# Дописывание stderr в файл (создаёт его, если он не существует)
gentoo ~ # cmd 2>&1 file# Перенаправление stderr в тот же поток, что и stdout
Комбинированные перенаправления
gentoo ~ # cmd > file 2>&1# Запись stdout и stderr в один файл
gentoo ~ # cmd &> file# Сокращённая запись предыдущей команды
gentoo ~ # cmd &>> file# Дописывание stdout и stderr в один файл
gentoo ~ # cmd 2>&1 > file# Сначала перенаправляет stderr в терминал,
# затем stdout в файл (важен порядок)
gentoo ~ # cmd &> file# Сокращённая запись предыдущей команды
gentoo ~ # cmd &>> file# Дописывание stdout и stderr в один файл
gentoo ~ # cmd 2>&1 > file# Сначала перенаправляет stderr в терминал,
# затем stdout в файл (важен порядок)
Перенаправление ввода
gentoo ~ # cmd <<< "string"# Передаёт строку (string) в команду как ввод
# (не надо вводить с клавиатуры)
gentoo ~ # cmd << EOF# Передаёт многострочный ввод в команду
text
EOF# Ввод считывается до указанного разделителя (EOF)
# (не надо вводить с клавиатуры)
gentoo ~ # cmd << EOF# Передаёт многострочный ввод в команду
text
EOF# Ввод считывается до указанного разделителя (EOF)
Полезные советы
Порядок имеет значение:
gentoo ~ # cmd > file 2>&1# Записывает stdout и stderr в файл
gentoo ~ # cmd 2>&1 > file# Оставляет stderr в терминале, а stdout записывает в файл
gentoo ~ # cmd 2>&1 > file# Оставляет stderr в терминале, а stdout записывает в файл
Используйте |& как сокращение для 2>&1 |, чтобы передать оба потока в конвейер.