Операторы перенаправления ввода вывода linux

Перенаправление стандартных потоков данных в Linux

Введение

Наблюдая за заводом извне, мы замечаем три потока:

    0. На территорию завода поступает входящий поток «сырья» — данных подлежащих переработке.

1. Из ворот выходит поток продукции — данных, подвергшихся переработке на заводе-процессе.

  • 2. Из трубы поднимается дым, по виду которого можно судить о работе завода. Если дыма не заметно, то завод работает нормально (у нас ведь экологически чистое производство информации). Если вдруг повалил густой дым, то, ясное дело, что-то не в порядке.
  • На компьютерном языке эти три потока данных называются стандартными потоками. Каждый имеет числовой дескриптор (номер), название и направление по умолчанию.

    Дескриптор 0: Входящий стандартный поток (Standart Input, stdin). По умолчанию, поступает со стандартного устройства ввода (обычно с клавиатуры).

    Дескриптор 1: Выходящий стандартный поток (Standar Output, stdout). По умолчанию направляется на стандартное устройство вывода (обычно экран монитора).

    Дескриптор 2: Стандартный поток сообщений об ошибках (Standart Error, stderr). С английского переводится как «стандартная ошибка», но в русском языке такое выражение звучит двусмысленно. Поэтому я предпочитаю называть его стандартным сообщением, тем более, что в большинстве случаев оно сообщает не об ошибке, а о ходе процесса. По умолчанию направляется туда же, куда и стандартный вывод — на экран монитора, но не смешивается со стандартным выводом, а раскладывается по разным «полкам».

    Входящий поток, показан зеленым, имеет дескриптор 0
    Выходящий поток, показан красным, имеет дескриптор 1
    Поток сообщений, показан синим, имеет дескриптор 2

    Вот пример стандартного ввода и вывода:

    Команда echo направляет поток данных с клавиатуры на экран дисплея.

    А вот пример стандартного сообщения об ошибке:

    Каждый из этих стандартных потоков можно перенаправлять, то есть направлять не туда, куда поток направляется по умолчанию. Это и есть перенаправление.

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

    Как видите, на экране не появились слова «стандартный ввод», зато в текущей директории появился файл ввод.txt с этими словами.

    Можно дописать в файл ввод.txt вывод других команд, не уничтожая имеющегося содержимого. Для этого служит оператор >>

    Проделайте этот опыт самостоятельно, чтобы убедиться, что это так. Для определения текущей директории применяется команда pwd:

    Это я на случай, если вы не сразу найдете файл ввод.txt. (pwd расшифровывается как «print working directory» — «сообщить рабочую директорию»).

    Внимание: Следите за тем, в какой директории вы находитесь и без надобности не перенаправляйте вывод в существующие файлы. Могут быть уничтожены важные файлы (особенно, если вы имеете дурную привычку работать под логином администратора — root’а).

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

    Например, команда tr, которая служит для перевода (замены) выбранных символов в другие символы или удаления их.

    На этот случай служит оператор перенаправления ввода ), предварив его номером перенаправляемого потока. Стандартный поток сообщений имеет дескриптор (номер) 2, вот и поставим двойку перед оператором перенаправления — 2> . Куда же перенаправить этот поток? Можно перенаправить в какой-нибудь файл, если хотите на досуге разобраться с этими сообщениями. (Например, при компиляции программ выдается множество сообщений, которые вовсе не бессмысленны). А если сообщения вам не нужны, то лучше перенаправить их в файл /dev/null. Это специальный файл, который принимает любое количество данных и обращает их в ничто — эдакая бездонная и безвозвратная мусорная корзина, а лучше — «черная дыра». Вот в нее то и направим ненужный поток сообщений:

    В итоге получаем на экране только вывод программы.

    Возникает резонный вопрос: «А можно ли прочитать на экране только сообщения, а вывод программы перенаправить в файл?». Конечно можно:

    а, принимая во внимание, что перенаправляется по умолчанию только стандартный вывод (поток номер 1), то единичку перед оператором перенаправления ставить ни к чему, результат будет один:

    Существует также возможность перенаправить потоки 1 и 2 в разные файлы:

    Убедитесь сами, что файл wc.txt не содержит стандартных сообщений.

    И последняя хитрость. Можно направить оба выходных потока: стандарный вывод и стандартное сообщение в один и тот же файл, так, чтобы в файле сохранить все, что мы увидели бы на экране монитора:

    Первый оператор перенаправления направляет стандартный вывод в файл, а второй оператор перенаправления указывает, что стандартное сообщение следует направить туда же, куда и поток номер 1.

    Источник

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

    Одна из самых интересных и полезных тем для системных администраторов и новых пользователей, которые только начинают разбираться в работе с терминалом — это перенаправление потоков ввода вывода Linux. Эта особенность терминала позволяет перенаправлять вывод команд в файл, или содержимое файла на ввод команды, объединять команды вместе, и образовать конвейеры команд.

    Читайте также:  Красивый файловый менеджер для windows 10

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

    Как работает перенаправление ввода вывода

    Все команды, которые мы выполняем, возвращают нам три вида данных:

    • Результат выполнения команды, обычно текстовые данные, которые запросил пользователь;
    • Сообщения об ошибках — информируют о процессе выполнения команды и возникших непредвиденных обстоятельствах;
    • Код возврата — число, которое позволяет оценить правильно ли отработала программа.

    В Linux все субстанции считаются файлами, в том числе и потоки ввода вывода linux — файлы. В каждом дистрибутиве есть три основных файла потоков, которые могут использовать программы, они определяются оболочкой и идентифицируются по номеру дескриптора файла:

    • STDIN или 0 — этот файл связан с клавиатурой и большинство команд получают данные для работы отсюда;
    • STDOUT или 1 — это стандартный вывод, сюда программа отправляет все результаты своей работы. Он связан с экраном, или если быть точным, то с терминалом, в котором выполняется программа;
    • STDERR или 2 — все сообщения об ошибках выводятся в этот файл.

    Перенаправление ввода / вывода позволяет заменить один из этих файлов на свой. Например, вы можете заставить программу читать данные из файла в файловой системе, а не клавиатуры, также можете выводить ошибки в файл, а не на экран и т д. Все это делается с помощью символов » «.

    Перенаправить вывод в файл

    Все очень просто. Вы можете перенаправить вывод в файл с помощью символа >. Например, сохраним вывод команды top:

    top -bn 5 > top.log

    Опция -b заставляет программу работать в не интерактивном пакетном режиме, а n — повторяет операцию пять раз, чтобы получить информацию обо всех процессах. Теперь смотрим что получилось с помощью cat:

    Символ «>» перезаписывает информацию из файла, если там уже что-то есть. Для добавления данных в конец используйте «>>». Например, перенаправить вывод в файл linux еще для top:

    top -bn 5 >> top.log

    По умолчанию для перенаправления используется дескриптор файла стандартного вывода. Но вы можете указать это явно. Эта команда даст тот же результат:

    top -bn 5 1>top.log

    Перенаправить ошибки в файл

    Чтобы перенаправить вывод ошибок в файл вам нужно явно указать дескриптор файла, который собираетесь перенаправлять. Для ошибок — это номер 2. Например, при попытке получения доступа к каталогу суперпользователя ls выдаст ошибку:

    Вы можете перенаправить стандартный поток ошибок в файл так:

    ls -l /root/ 2> ls-error.log
    $ cat ls-error.log

    Чтобы добавить данные в конец файла используйте тот же символ:

    ls -l /root/ 2>>ls-error.log

    Перенаправить стандартный вывод и ошибки в файл

    Вы также можете перенаправить весь вывод, ошибки и стандартный поток вывода в один файл. Для этого есть два способа. Первый из них, более старый, состоит в том, чтобы передать оба дескриптора:

    ls -l /root/ >ls-error.log 2>&1

    Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:

    ls -l /root/ &> ls-error.log

    Также можно использовать добавление вместо перезаписи:

    ls -l /root/ &>> ls-error.log

    Стандартный ввод из файла

    Большинство программ, кроме сервисов, получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры. Но вы можете заставить программу читать данные из файла с помощью оператора » cat

    Вы также можете сразу же перенаправить вывод тоже в файл. Например, пересортируем список:

    Таким образом, мы в одной команде перенаправляем ввод вывод linux.

    Использование тоннелей

    Можно работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой. Это очень полезно для выполнения сложных операций. Например, выведем пять недавно измененных файлов:

    ls -lt | head -n 5

    С помощью утилиты xargs вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:

    echo test/ tmp/ | xargs -n 1 cp -v testfile.sh

    Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда — это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:

    echo «Тест работы tee» | tee file1

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

    Выводы

    В этой статье мы рассмотрели основы перенаправления потоков ввода вывода Linux. Теперь вы знаете как перенаправить вывод в файл linux или вывод из файла. Это очень просто и удобно. Если у вас остались вопросы, спрашивайте в комментариях!

    Читайте также:  Восстановление загрузчика grub после установки windows

    Источник

    Перенаправление ввода/вывода в Linux

    Введение

    Стандартные потоки ввода и вывода в Linux являются одним из наиболее распространенных средств для обмена информацией процессов, а перенаправление >, >> и | является одной из самых популярных конструкций командного интерпретатора.

    В данной статье мы ознакомимся с возможностями перенаправления потоков ввода/вывода, используемых при работе файлами и командами.

    Требования

    • Linux-система, например, Ubuntu 20.04

    Потоки

    Стандартный ввод при работе пользователя в терминале передается через клавиатуру.

    Стандартный вывод и стандартная ошибка отображаются на дисплее терминала пользователя в виде текста.

    Ввод и вывод распределяется между тремя стандартными потоками:

    • stdin — стандартный ввод (клавиатура),
    • stdout — стандартный вывод (экран),
    • stderr — стандартная ошибка (вывод ошибок на экран).

    Потоки также пронумерованы:

    Из стандартного ввода команда может только считывать данные, а два других потока могут использоваться только для записи. Данные выводятся на экран и считываются с клавиатуры, так как стандартные потоки по умолчанию ассоциированы с терминалом пользователя. Потоки можно подключать к чему угодно: к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением:

    • file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
    • 2> file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
    • >>file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
    • 2>>file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
    • &>file или >&file — направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >file 2>&1.

    Стандартный ввод

    Стандартный входной поток обычно переносит данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства типа клавиатура. Стандартный ввод прекращается по достижении EOF (конец файла), который указывает на то, что данных для чтения больше нет.

    EOF вводится нажатием сочетания клавиш Ctrl+D.

    Рассмотрим работу со стандартным выводом на примере команды cat (от CONCATENATE, в переводе «связать» или «объединить что-то»).

    Cat обычно используется для объединения содержимого двух файлов.

    Cat отправляет полученные входные данные на дисплей терминала в качестве стандартного вывода и останавливается после того как получает EOF.

    Пример

    В открывшейся строке введите, например, 1 и нажмите клавишу Enter. На дисплей выводится 1. Введите a и нажмите клавишу Enter. На дисплей выводится a.

    Дисплей терминала выглядит следующим образом:

    Для завершения ввода данных следует нажать сочетание клавиш Ctrl + D.

    Стандартный вывод

    Стандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала.

    При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке:

    Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено:

    При выполнении echo без каких-либо аргументов, возвращается пустая строка.

    Пример

    Команда объединяет три файла: file1, file2 и file3 в один файл bigfile:

    Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile.

    Стандартная ошибка

    Стандартная ошибка записывает ошибки, возникающие в ходе исполнения программы. Как и в случае стандартного вывода, по умолчанию этот поток выводится на терминал дисплея.

    Пример

    Рассмотрим пример стандартной ошибки с помощью команды ls, которая выводит список содержимого каталогов.

    При запуске без аргументов ls выводит содержимое в пределах текущего каталога.

    Введем команду ls с каталогом % в качестве аргумента:

    В результате должно выводиться содержимое соответствующей папки. Но так как каталога % не существует, на дисплей терминала будет выведен следующий текст стандартной ошибки:

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

    Linux включает в себя команды перенаправления для каждого потока.

    Команды со знаками > или — стандартный вывод,

  • — стандартная ошибка.
  • Команды со знаками >> или > — стандартный вывод,

  • > — стандартная ошибка.
  • Пример

    В приведенном примере команда cat используется для записи в файл file1, который создается в результате цикла:

    Для завершения цикла нажмите сочетание клавиш Ctrl + D.

    Если файла file1 не существует, то в текущем каталоге создается новый файл с таким именем.

    Для просмотра содержимого файла file1 введите команду:

    В результате на дисплей терминала должно быть выведено следующее:

    Для перезаписи содержимого файла введите следующее:

    Для завершения цикла нажмите сочетание клавиш Ctrl + D.

    В результате на дисплей терминала должно быть выведено следующее:

    Читайте также:  Что делать если windows не находит флешку

    Предыдущего текста в текущем файле больше не существует, так как содержимое файла было переписано командой >.

    Для добавления нового текста к уже существующему в файле с помощью двойных скобок >> выполните команду:

    Для завершения цикла нажмите сочетание клавиш Ctrl + D.

    Откройте file1 снова и в результате на дисплее монитора должно быть отражено следующее:

    Каналы

    Каналы используются для перенаправления потока из одной программы в другую. Стандартный вывод данных после выполнения одной команды перенаправляется в другую через канал. Данные первой программы, которые получает вторая программа, не будут отображаться. На дисплей терминала будут выведены только отфильтрованные данные, возвращаемые второй командой.

    Пример

    В результате каждый файл текущего каталога будет размещен на новой строке:

    Перенаправлять данные с помощью каналов можно как из одной команды в другую, так и из одного файла к другому, а перенаправление с помощью > и >> возможно только для перенаправления данных в файлах.

    Пример

    Для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

    Вывод команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле loglist в виде списка (например, Config.log, Logdat.svd и Mylog.bat).

    При использовании нескольких фильтров в одной команде рекомендуется разделять их с помощью знака канала |.

    Фильтры

    Фильтры представляют собой стандартные команды Linux, которые могут быть использованы без каналов:

    • find — возвращает файлы с именами, которые соответствуют передаваемому аргументу.
    • grep — возвращает только строки, содержащие (или не содержащие) заданное регулярное выражение.
    • tee — перенаправляет стандартный ввод как стандартный вывод и один или несколько файлов.
    • tr — находит и заменяет одну строку другой.
    • wc — подсчитывает символы, линии и слова.

    Как правило, все нижеприведенные команды работают как фильтры, если у них нет аргументов (опции могут быть):

    • cat — считывает данные со стандартного потока ввода и передает их на стандартный поток вывода. Без опций работает как простой повторитель. С опциями может фильтровать пустые строки, нумеровать строки и делать другую подобную работу.
    • head — показывает первые 10 строк (или другое заданное количество), считанных со стандартного потока ввода.
    • tail — показывает последние 10 строк (или другое заданное количество), считанные со стандартного потока ввода. Важный частный случай tail -f, который в режиме слежения показывает концовку файла. Это используется, в частности, для просмотра файлов журнальных сообщений.
    • cut — вырезает столбец (по символам или полям) из потока ввода и передает на поток вывода. В качестве разделителей полей могут использоваться любые символы.
    • sort — сортирует данные в соответствии с какими-либо критериями, например, арифметически по второму столбцу.
    • uniq — удаляет повторяющиеся строки. Или (с ключом -с) не просто удалить, а написать сколько таких строк было. Учитываются только подряд идущие одинаковые строки, поэтому часто данные сортируются перед тем как отправить их на вход программе.
    • bc — вычисляет каждую отдельную строку потока и записывает вместо нее результат вычисления.
    • hexdump — показывает шестнадцатеричное представление данных, поступающих на стандартный поток ввода.
    • strings — выделяет и показывает в стандартном потоке (или файле) то, что напоминает строки. Всё что не похоже на строковые последовательности, игнорируется. Команда полезна в сочетании с grep для поиска интересующих строковых последовательностей в бинарных файлах.
    • sed — обрабатывает текст в соответствии с заданным скриптом. Наиболее часто используется для замены текста в потоке: sed s/было/стало/g.
    • awk — обрабатывает текст в соответствии с заданным скриптом. Как правило, используется для обработки текстовых таблиц, например, вывод ps aux и т.д.
    • sh -s — текст, который передается на стандартный поток ввода sh -s. может интерпретироваться как последовательность команд shell. На выход передается результат их исполнения.
    • ssh — средство удаленного доступа ssh, может работать как фильтр, который подхватывает данные, переданные ему на стандартный поток ввода, затем передает их на удаленный хост и подает на вход процессу программы, имя которой было передано ему в качестве аргумента. Результат выполнения программы (то есть то, что она выдала на стандартный поток вывода) передается со стандартного вывода ssh.

    Если в качестве аргумента передается файл, команда-фильтр считывает данные из этого файла, а не со стандартного потока ввода (есть исключения, например, команда tr, обрабатывающая данные, поступающие исключительно через стандартный поток ввода).

    Пример

    Команда tee, как правило, используется для просмотра выводимого содержимого при одновременном сохранении его в файл.

    Пример

    Допускается перенаправление нескольких потоков в один файл:

    В результате сообщение о неверной опции «z» в команде ls будет записано в файл t2, поскольку stderr перенаправлен в файл.

    Для просмотра содержимого файла file3 введите команду cat:

    В результате на дисплее терминала отобразиться следующее:

    Заключение

    Мы рассмотрели возможности работы с перенаправлениями потоков >, >> и |, использование которых позволяет лучше работать с bash-скриптами.

    Источник

    Оцените статью