Перенаправление ввода/вывода в 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 в файл (создаёт его, если он не существует)

где 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 |, чтобы передать оба потока в конвейер.