Перенаправление ввода/вывода в Linux

В Linux существует четыре стандартных потока ввода/вывода данных.

Базовые перенаправления

gentoo ~ # cmd < file# Чтение ввода из файла вместо клавиатуры
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 > file 2>&1# Запись stdout и stderr в один файл
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 > file 2>&1# Записывает stdout и stderr в файл
gentoo ~ # cmd 2>&1 > file# Оставляет stderr в терминале, а stdout записывает в файл

Используйте |& как сокращение для 2>&1 |, чтобы передать оба потока в конвейер.