Перенаправление потоков данных (STDIN, STDOUT,STDERR)

Оболочка управляет вводом и выводом запускаемых команд. Команды в оболочке используют, обычно, один поток ввода (STDIN) и два вида потока вывода: стандартный вывод (STDOUT) и стандартный вывод ошибок (STDERR).

STDIN

Стандартный ввод используется для получения данных. (В этом случае мы использовали команду read для получения данных от пользователя)

STDOUT

Стандартный вывод используется для «правильного» вывода информации от команды. Например, команда ls, вывела результат своего выполнения на экран.

STDERR

Стандартный вывод ошибок используется для вывода ошибок. В примере выше, файла с названием anotherfile не нашлось в текущем каталоге, то данное сообщение попадает в поток ошибок.

STDIN, STDOUT и STDERR это три стандартных потока данных в Linux. В системе они идентифицируются по номерам:

0 — Стандартный ввод
1 — Стандартный вывод
2 — Стандартный поток ошибок

По умолчанию, для STDIN используется клавиатура, а для STDOUT и STDERR используют терминал. Но мы можем перенаправить их туда, куда нам будет необходимо.

Перенаправление вывода команды в другую команду.

Для перенаправления потока вывода с одной команды в другой в оболочке используется вертикальная черта ‘|’. Например, чтобы отсортировать строки в нашем файле в алфавитном порядке, можем перенаправить вывод команды cat в команду sort.

Перенаправление вывода команды в файл.

Для перенаправления вывода команды в файл, используется функция оболочки, называемая перенаправлением вывода (output rederection). Просто добавьте символ «>» с именем файла, в который будет перенаправлен вывод:

Весь вывод был направлен в файл alias.txt. Если файла куда перенаправляется поток не существует, то он будет создан. Если же он есть, то его содержимое будет перезаписано.

Для того, чтобы добавлять данные в файл вместо того, чтобы перезаписывать его каждый раз, используйте символ «>>«.

Перенаправление вывода нескольких команд в один файл

Вы можете перенаправить сразу несколько команд в один файл. Для этого необходимо нужные нам команды заключить в фигурные скобки «{}»

Например,

Перенаправление ввода.

Кроме перенаправление вывода, есть возможность перенаправления ввода (input redirection), обеспечивающее стандартный ввод из файла, а не, например, с клавиатуры или сканера. Для такого перенаправления используется символ «<» и имя файла, чтобы перенаправить стандартный ввод.

Возьмем к примеру команду wc, которая подсчитывает количество строк, слов и символов в файле. И передадим ей на ввод наш файл

Важным отличием поведения этих двух выводов команд, является то, что в первом случае команда wc получает в качестве аргумента имя файла. Поэтому она находит, открывает и читает содержимое файла на диске. А вот во втором случае команда wc открывается без аргументов, поэтому они считываются со стандартного ввода. Это равносильно тому, что вы просто запустите команду и введете весь текст файла с клавиатуры.

Перенаправление потока ошибок.

Некоторые сообщения, которые мы видим на экране в результате выполнения команд, нельзя перенаправить с помощью «>«. Например, выполним какую-нибудь операцию с несуществующим файлом

Если мы перенаправим это сообщение с помощью стандартного оператора «>«, то сообщение все равно будет выведено на экран. А файл errors все равно останется пустым.

Команды Linux могут создавать более одного потока вывода. Так вот в дополнению к потоку вывода есть еще и поток вывода ошибок (stderr). Этот поток обычно зарезервирован для сообщений об ошибках. Хоть и попадалось как-то, когда вывод версии приложения отправлялся именно в этот поток.

Оба потока — stdout и stderr на экране одинаково, но по своей сути они разные. И для того, чтобы перенаправить поток ошибок можно с помощью символов «2>«.

Либо вариант с записью сообщений об ошибках в конец файла: «2>>«.

А еще можно перенаправить все потоки вывода одним оператором «&>«.

Перенаправление на сетевой адрес

bash рассматривает некоторые пути как особые и может осуществлять некоторую сетевую работу, отправляя сообщения в /dev/{udp|tcp}/host/port. Bash не может создать сервер, но может инициировать соединение, и прочитать результаты.

Например, давайте отправим простой запрос:

В результате получим страницу www.google.com, установленную по умолчанию

Или, например, следующая команда:

Отправит сообщение «HI» на порт 6666 по адресу 192.168.1.1

Was this helpful?

0 / 0

Добавить комментарий 0