Перенаправление ввода-вывода – один из основных принципов работы современных 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:
Аналогичным образом существует понятие стандартного ввода – 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
Произошло сразу две интересных вещи:
Наша команда cat не показала никакого стандартного вывода. Это логично: файл не найдет, поэтому ничего не было прочитано. А сообщение об ошибке теперь перенаправлено в файл /tmp/redirected.out.
В файле /tmp/redirected.out теперь хранится наше сообщение об ошибке
Для первого поста на эту дему – вполне достаточно. Добавлю часть этого контента в Unix Redirects Reference страницу и как-нибудь расскажу ещё.
Всем пока!
Ссылки В Тему
Basic Unix Commands
Advanced Unix Commands
Unix Commands
Давайте учиться вместе!
Заходите на страницу Facebook или присоединяйтесь к чату в Telegram:
Я использую браузер Brave
Попробуйте сами:
IT Консалтинг
У меня есть консалтинговая компания: Tech Stack Solutions. Я помогаю планировать и создавать облачные решения на базе AWS и помогаю с развёртыванием и поддержкой сервисов на Unix/Linux. Свяжитесь со мной тут.