Перенаправление ввода-вывода в Unix

Перевод: Unix Input/Output Redirection

Перенаправление ввода-вывода Перенаправление ввода-вывода в Unix

Перенаправление ввода-вывода – один из основных принципов работы современных Unix и Linux систем. Это отличный способ организации обмена данных между командами и процессами.

На самом деле, есть столько примеров работы с перенаправлением, что понадобится отдельный раздел Unix Input/Output Redirection Reference (создам эту страницу чуть позже).

Ну а сегодня я просто решил показать вам пару примеров – попробуйте их сами и напишите мне, как всё получилось. Если есть вопросы – задавайте и я обязательно отвечу и помогу (ну и в раздел Unix Input/Output Redirect добавлю).

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

Допустим, мы хотим создать простой текстовый файл с одной единственной строчкой: сообщением “Hello”. Один из способов это сделать – вывести слово Hello с помощью команды echo, а потом перенаправить стандартный вывод от этой команды в другой файл с помощью перенаправления (знак >):

greys@maverick:~ $ echo Hello > /tmp/try.hello

Основное правило перенаправления: запускайте любые команды, а в конце командной строки добавляйте знак “больше” (>) и указывайте имя файла, куда нужно перенаправить вывод.

ПОЛЕЗНО ЗНАТЬ: Такой стандартный вывод часто называют STDOUT.

Если теперь проверить содержимое файла /tmp/try.hello, там будет наше слово Hello:

greys@maverick:~ $ cat /tmp/try.hello
Hello

Как я уже сказал, таким образом можно перенаправлять вывод любых команд. В том числе, мы можем перенаправить вывод от команды “cat /tmp/try.hello” в какой-то другой файл. Пусть это будет файл /tmp/try.hello2, в нём тоже окажется наше сообщение Hello:

greys@maverick:~ $ cat /tmp/try.hello > /tmp/try.hello2
greys@maverick:~ $ cat /tmp/try.hello2 
Hello

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

Аналогичным образом существует понятие стандартного ввода – STDIN. Такое перенаправление берёт данные из файла и предоставляет их в качестве ввода для любой команды Unix.

Для стандартного ввода мы используем знак “меньше” (<) и указываем файл. Например:

greys@maverick:~ $ cat < /tmp/try.hello
Hello

Это самый простой пример, и не самый полезный: большинство команд в Unix и так ожидает имя входного файла, не нужно никаких перенаправлений. Так что можно было просто выполнить команду “cat /tmp/try.hello”.

Но очень важно понять здесь разницу: в пример со стандартным вводом STDIN, команда cat не получила и не знает никаких входящих файлов. Стало быть, она ожидает ввода с клавиатуры или входящего потока данных, который мы и предоставляем с помощью перенаправления ввода из файла /tmp/try.hello.

Перенаправление сообщений об ошибках

А что же произойдёт, если ваша команда выдала ошибку? Сам текст ошибки не является стандартным выводом, результатом корректной работы команды. Поэтому в Unix есть отдельное понятие для потока ошибок: STDERR.

Это, на самом деле, очень умная штука в Unix/Linux системах: сообщения об ошибках будут считаться отдельным типом текстовой информации. Так что в консоли вы видите и ошибки, и сами результаты команды, идущими подряд. Но для операционной системы они являются двумя отдельными потоками данных.

Вот вам пример, я пытаюсь посмотреть содержимое не существующего файла:

greys@maverick:~ $ cat /tmp/try.hello3
cat: /tmp/try.hello3: No such file or directory

Эта строчка “cat: /tmp/try.hello3: No such file or directory” является сообщением об ошибке, а не выводом содержимого файла /tmp/try.hello3. Поэтому, когда я перенаправлю стандартный вывод в другой файл, ничего не произойдёт (в файл вывода /tmp/redirected.out ничего не запишется) :

greys@maverick:~ $ cat /tmp/try.hello3 > /tmp/redirected.out
cat: /tmp/try.hello3: No such file or directory
greys@maverick:~ $ cat /tmp/redirected.out
greys@maverick:~ $

Здорово, правда?

Для того, чтобы заполучить и перенаправить сообщения об ошибке, нужно воспользоваться специальным синтаксисом перенаправления. А именно: указать цифру 2 перед знаком перенаправления >, вот так:

greys@maverick:~ $ cat /tmp/try.hello3 2> /tmp/redirected.out greys@maverick:~ $ cat /tmp/redirected.out 
cat: /tmp/try.hello3: No such file or directory 

Произошло сразу две интересных вещи:

  1. Наша команда cat не показала никакого стандартного вывода. Это логично: файл не найдет, поэтому ничего не было прочитано. А сообщение об ошибке теперь перенаправлено в файл /tmp/redirected.out.
  2. В файле /tmp/redirected.out теперь хранится наше сообщение об ошибке

Для первого поста на эту дему – вполне достаточно. Добавлю часть этого контента в Unix Redirects Reference страницу и как-нибудь расскажу ещё.

Всем пока!

Ссылки В Тему

  • Basic Unix Commands
  • Advanced Unix Commands
  • Unix Commands



Давайте учиться вместе!

Заходите на страницу Facebook или присоединяйтесь к чату в Telegram:
Я использую браузер Brave
Попробуйте сами: Brave Browser
IT Консалтинг
У меня есть консалтинговая компания: Tech Stack Solutions. Я помогаю планировать и создавать облачные решения на базе AWS и помогаю с развёртыванием и поддержкой сервисов на Unix/Linux. Свяжитесь со мной тут.

Recent Tweets