Перенаправление ввода-вывода в Unix
Перевод: Unix Input/Output Redirection
Перенаправление ввода-вывода в Unix
Перенаправление ввода-вывода – один из основных принципов работы современных Unix и Linux систем. Это отличный способ организации обмена данных между командами и процессами.
На самом деле, есть столько примеров работы с перенаправлением, что понадобится отдельный раздел Unix Input/Output Redirection Reference (создам эту страницу чуть позже).
Ну а сегодня я просто решил показать вам пару примеров – попробуйте их сами и напишите мне, как всё получилось. Если есть вопросы – задавайте и я обязательно отвечу и помогу (ну и в раздел Unix Input/Output Redirect добавлю).
Перенаправление стандартного вывода
Допустим, мы хотим создать простой текстовый файл с одной единственной строчкой: сообщением “Hello”. Один из способов это сделать – вывести слово Hello с помощью команды echo, а потом перенаправить стандартный вывод от этой команды в другой файл с помощью перенаправления (знак >):
Основное правило перенаправления: запускайте любые команды, а в конце командной строки добавляйте знак “больше” (>) и указывайте имя файла, куда нужно перенаправить вывод.
ПОЛЕЗНО ЗНАТЬ: Такой стандартный вывод часто называют STDOUT.
Если теперь проверить содержимое файла /tmp/try.hello, там будет наше слово Hello:
Как я уже сказал, таким образом можно перенаправлять вывод любых команд. В том числе, мы можем перенаправить вывод от команды “cat /tmp/try.hello” в какой-то другой файл. Пусть это будет файл /tmp/try.hello2, в нём тоже окажется наше сообщение Hello:
Перенаправление стандартного ввода
Аналогичным образом существует понятие стандартного ввода – STDIN. Такое перенаправление берёт данные из файла и предоставляет их в качестве ввода для любой команды Unix.
Для стандартного ввода мы используем знак “меньше” (<) и указываем файл. Например:
Это самый простой пример, и не самый полезный: большинство команд в Unix и так ожидает имя входного файла, не нужно никаких перенаправлений. Так что можно было просто выполнить команду “cat /tmp/try.hello”.
Но очень важно понять здесь разницу: в пример со стандартным вводом STDIN, команда cat не получила и не знает никаких входящих файлов. Стало быть, она ожидает ввода с клавиатуры или входящего потока данных, который мы и предоставляем с помощью перенаправления ввода из файла /tmp/try.hello.
Перенаправление сообщений об ошибках
А что же произойдёт, если ваша команда выдала ошибку? Сам текст ошибки не является стандартным выводом, результатом корректной работы команды. Поэтому в Unix есть отдельное понятие для потока ошибок: STDERR.
Это, на самом деле, очень умная штука в Unix/Linux системах: сообщения об ошибках будут считаться отдельным типом текстовой информации. Так что в консоли вы видите и ошибки, и сами результаты команды, идущими подряд. Но для операционной системы они являются двумя отдельными потоками данных.
Вот вам пример, я пытаюсь посмотреть содержимое не существующего файла:
Эта строчка “cat: /tmp/try.hello3: No such file or directory” является сообщением об ошибке, а не выводом содержимого файла /tmp/try.hello3. Поэтому, когда я перенаправлю стандартный вывод в другой файл, ничего не произойдёт (в файл вывода /tmp/redirected.out ничего не запишется) :
Здорово, правда?
Для того, чтобы заполучить и перенаправить сообщения об ошибке, нужно воспользоваться специальным синтаксисом перенаправления. А именно: указать цифру 2 перед знаком перенаправления >, вот так:
Произошло сразу две интересных вещи:
- Наша команда cat не показала никакого стандартного вывода. Это логично: файл не найдет, поэтому ничего не было прочитано. А сообщение об ошибке теперь перенаправлено в файл /tmp/redirected.out.
- В файле /tmp/redirected.out теперь хранится наше сообщение об ошибке
Для первого поста на эту дему – вполне достаточно. Добавлю часть этого контента в Unix Redirects Reference страницу и как-нибудь расскажу ещё.
Всем пока!
Ссылки В Тему
- Basic Unix Commands
- Advanced Unix Commands
- Unix Commands
Перенаправление ввода-вывода в Unix
Перенаправление ввода-вывода – один из основных принципов работы современных Unix и Linux систем. Это отличный способ организации обмена данных между командами и процессами.
На самом деле, есть столько примеров работы с перенаправлением, что понадобится отдельный раздел Unix Input/Output Redirection Reference (создам эту страницу чуть позже).
Ну а сегодня я просто решил показать вам пару примеров – попробуйте их сами и напишите мне, как всё получилось. Если есть вопросы – задавайте и я обязательно отвечу и помогу (ну и в раздел Unix Input/Output Redirect добавлю).
Перенаправление стандартного вывода
Допустим, мы хотим создать простой текстовый файл с одной единственной строчкой: сообщением “Hello”. Один из способов это сделать – вывести слово Hello с помощью команды echo, а потом перенаправить стандартный вывод от этой команды в другой файл с помощью перенаправления (знак >):
Основное правило перенаправления: запускайте любые команды, а в конце командной строки добавляйте знак “больше” (>) и указывайте имя файла, куда нужно перенаправить вывод.
ПОЛЕЗНО ЗНАТЬ: Такой стандартный вывод часто называют STDOUT.
Если теперь проверить содержимое файла /tmp/try.hello, там будет наше слово Hello:
Как я уже сказал, таким образом можно перенаправлять вывод любых команд. В том числе, мы можем перенаправить вывод от команды “cat /tmp/try.hello” в какой-то другой файл. Пусть это будет файл /tmp/try.hello2, в нём тоже окажется наше сообщение Hello:
Перенаправление стандартного ввода
Аналогичным образом существует понятие стандартного ввода – STDIN. Такое перенаправление берёт данные из файла и предоставляет их в качестве ввода для любой команды Unix.
Для стандартного ввода мы используем знак “меньше” (<) и указываем файл. Например:
Это самый простой пример, и не самый полезный: большинство команд в Unix и так ожидает имя входного файла, не нужно никаких перенаправлений. Так что можно было просто выполнить команду “cat /tmp/try.hello”.
Но очень важно понять здесь разницу: в пример со стандартным вводом STDIN, команда cat не получила и не знает никаких входящих файлов. Стало быть, она ожидает ввода с клавиатуры или входящего потока данных, который мы и предоставляем с помощью перенаправления ввода из файла /tmp/try.hello.
Перенаправление сообщений об ошибках
А что же произойдёт, если ваша команда выдала ошибку? Сам текст ошибки не является стандартным выводом, результатом корректной работы команды. Поэтому в Unix есть отдельное понятие для потока ошибок: STDERR.
Это, на самом деле, очень умная штука в Unix/Linux системах: сообщения об ошибках будут считаться отдельным типом текстовой информации. Так что в консоли вы видите и ошибки, и сами результаты команды, идущими подряд. Но для операционной системы они являются двумя отдельными потоками данных.
Вот вам пример, я пытаюсь посмотреть содержимое не существующего файла:
Эта строчка “cat: /tmp/try.hello3: No such file or directory” является сообщением об ошибке, а не выводом содержимого файла /tmp/try.hello3. Поэтому, когда я перенаправлю стандартный вывод в другой файл, ничего не произойдёт (в файл вывода /tmp/redirected.out ничего не запишется) :
Здорово, правда?
Для того, чтобы заполучить и перенаправить сообщения об ошибке, нужно воспользоваться специальным синтаксисом перенаправления. А именно: указать цифру 2 перед знаком перенаправления >, вот так:
Произошло сразу две интересных вещи:
- Наша команда cat не показала никакого стандартного вывода. Это логично: файл не найдет, поэтому ничего не было прочитано. А сообщение об ошибке теперь перенаправлено в файл /tmp/redirected.out.
- В файле /tmp/redirected.out теперь хранится наше сообщение об ошибке
Для первого поста на эту дему – вполне достаточно. Добавлю часть этого контента в Unix Redirects Reference страницу и как-нибудь расскажу ещё.
Всем пока!
Ссылки В Тему
- Basic Unix Commands
- Advanced Unix Commands
- Unix Commands