Потоки ввода и вывода. Перенаправление потоков, создание цепочек программ.

Виды потоков в 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". Она читает данные из стандартного ввода и записывает в стандартный вывод и в файлы. Например:

Альтернативный текст

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