Потоки ввода и вывода. Перенаправление потоков, создание цепочек программ.
Содержание
Виды потоков в linux
Все команды, которые пользователь или программа выполняют в консоли, могут возвращать 3 вида данных:
- Результат выполнения команды - обычно различные текстовые (и числовые) данные, которые запросил пользователь, или системные сообщения.
- Сообщения об ошибках - информируют о возникших ошибках.
- Коды возврата - числа, характеризующие работу программ и позволяющие установить, правильно ли работала программа.
В linux потоки ввода-вывода считаются linux-файлами. Существует три основных файла потоков, которые могут использовать программы, они определяются оболочкой и идентифицируются по своему специальному номеру.
- STDIN или 0 - этот файл по умолчанию связан с клавиатурой и является потоком ввода;
- STDOUT или 1 - это стандартный вывод, куда программа отправляет все результаты своей работы. По умолчанию данные выводятся на экран терминала, в котором работала программа;
- STDERR или 2 - все сообщения об ошибках выводятся в этот файл-поток.
Перенаправление ввода / вывода позволяет заменить один из этих файлов на свой. Например, вы можете заставить программу читать данные из файла в файловой системе, а не с клавиатуры, также можете выводить ошибки в файл, а не на экран, и т д. Все это делается с помощью комбинаций символов "<" и ">".
Перенаправление вывода в файл
Вы можете перенаправить вывод в файл с помощью символа ">" или "1>" в свой файл (символ ставится после команды, за ним указывается имя файла). Если такого файла не существует, он автоматически создастся во время выполнения команды. Важно помнить, что при перенаправлении потока в непустой файл его содержимое перезапишется. Для добавления данных в конец следует использовать ">>". Проиллюстрируем эти процессы на примере команды echo:

Перенаправление потока ошибок в файл
Чтобы перенаправить вывод ошибок в файл, нужно явно указать дескриптор ("номер") файла, в который планируется перенаправлять. Для ошибок это номер 2. Например, при попытке получения перехода в несуществующую директорию cd выдаст ошибку. Перенаправим её в какой-нибудь файл:

Заметим, что для добавления данных в конец файла используется тот же символ "2>>".
Перенаправление стандартного вывода и ошибок в один файл
Существует возможность перенаправить весь вывод: ошибки и стандартный поток вывода - в один файл. Для этого нужно воспользоваться комбинацией "&>" или "&>>" для дописывания в конец.
ls -l /root/ &> ls-error.log
—вывод результата команды "ls -l" и ошибок, возникших при её выполнении, в файл " ls-error.log"
Перенаправление ввода на файл
Большинство программ получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры, но можно заставить программу читать данные из файла с помощью оператора "<" (он прописывается перед именем файла, из которого нужно считать данные).

В данном примере был создан текстовый файл со списком строк. Затем в этот файл был перенаправлен поток ввода сортирующей команды, а её поток вывода был направлен в файл 'list.out'. Далее демонстрировалась возможность чтения из файла и поиск строки с нужным словом.
Использование тоннелей для создания цепочек программ
Рассмотрим оператор "|":
{команда 1} | {команда 2}
Оператор "|" делает подаёт вывод команды 1 на вход команды 2.
Например, выведем 2 недавно измененных файла, а затем запросим вывод процессов пользователя:

С помощью утилиты "xargs" вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:

Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда - это "tee". Она читает данные из стандартного ввода и записывает в стандартный вывод и в файлы. Например:

В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.