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

Содержание
  1. Перенаправление стандартных потоков данных в Linux
  2. Введение
  3. Перенаправление стандартного вывода
  4. Перенаправление ввода
  5. Фундаментальные основы Linux. Часть IV. Программные каналы и команды
  6. Глава 16. Перенаправление потоков ввода/вывода
  7. Потоки данных stdin, stdout и stderr
  8. Перенаправление стандартного потока вывода
  9. Перенаправление стандартного потока ошибок
  10. Перенаправление стандартного потока вывода и программные каналы
  11. Объединение стандартных потоков вывода stdout и ошибок stderr
  12. Перенаправление стандартного потока ввода
  13. Неоднозначное перенаправление потоков ввода/вывода
  14. Быстрая очистка содержимого файла
  15. Практическое задание: перенаправление потоков ввода/вывода
  16. Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода
  17. Перенаправление ввода-вывода в Linux
  18. Потоки ввода-вывода
  19. Стандартный ввод
  20. Стандартный вывод
  21. Стандартная ошибка
  22. Перенаправление потоков
  23. Конвейеры
  24. Фильтры
  25. Примеры перенаправления ввода-вывода
  26. команда > файл
  27. команда > /dev/null
  28. команда 2 > файл
  29. команда >> файл
  30. команда 2>>файл
  31. команда | команда
  32. команда | tee файл
  33. команда | команда | команда >> файл
  34. Заключение

Перенаправление стандартных потоков данных в 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), то единичку перед оператором перенаправления ставить ни к чему, результат будет один:

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

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

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

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

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

    Источник

    Фундаментальные основы Linux. Часть IV. Программные каналы и команды

    Оригинал: Linux Fundamentals
    Автор: Paul Cobbaut
    Дата публикации: 16 октября 2014 г.
    Перевод: А.Панин
    Дата перевода: 15 декабря 2014 г.

    Глава 16. Перенаправление потоков ввода/вывода

    Одной из мощных возможностей командной оболочки системы Unix является механизм перенаправления потоков ввода/вывода с возможностью задействования программных каналов .

    В данной главе даются пояснения относительно перенаправления стандартных потоков ввода, вывода и ошибок.

    Потоки данных stdin, stdout и stderr

    Командная оболочка bash поддерживает три типа базовых потоков данных; она принимает данные из стандартного потока ввода stdin (поток 0 ), отправляет данные в стандартный поток вывода stdout (поток 1 ), а также отправляет сообщения об ошибках в стандартный поток ошибок stderr (поток 2 ).

    Приведенная ниже иллюстрация является графической интерпретацией этих трех потоков данных.

    Клавиатура обычно служит источником данных для стандартного потока ввода stdin , в то время, как стандартные потоки вывода stdout и ошибок stderr используются для вывода данных. Новых пользователей Linux может смущать подобное разделение, так как не существует очевидного способа дифференцирования стандартных потоков вывода stdout и ошибок stderr . Опытные же пользователи знают о том, что разделение стандартных потоков вывода и ошибок может оказаться весьма полезным.

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

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

    Операция перенаправления потока данных stdout (>)

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

    командная оболочка будет рассматривать только два аргумента (echo = аргумент 0, привет = аргумент 1). Описание операции перенаправления потока данных удаляется перед началом подсчета количества аргументов.

    Содержимое выходного файла удаляется

    Параметр командной оболочки noclobber

    Нейтрализация влияния параметра командной оболочки noclobber

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

    Операция перенаправления потока данных stderr (2>)

    Перенаправление стандартного потока ошибок осуществляется с помощью оператора 2> . Такое перенаправление может оказаться очень полезным для предотвращения заполнения вашего экрана сообщениями об ошибках.

    Операция перенаправления нескольких потоков данных 2>&1

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

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

    Объединение стандартных потоков вывода stdout и ошибок stderr

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

    Операция перенаправления потока данных stdin ( стандартного потока ввода stdin осуществляется с помощью оператора here document (иногда называемая структурой here-is-document) является механизмом для ввода данных до момента обнаружения определенной последовательности символов (обычно EOF). Маркер EOF может быть либо введен вручную, либо вставлен автоматически при нажатии комбинации клавиш Ctrl-D.

    Структура here string может использоваться для непосредственной передачи строк команде. При использовании данной структуры достигается такой же эффект, как и при использовании команды echo строка | команда (но вы сможете избежать создания одного дополнительного процесса).

    Для получения дополнительной информации об алгоритме base64 следует обратиться к стандарту rfc 3548.

    Неоднозначное перенаправление потоков ввода/вывода

    Быстрая очистка содержимого файла

    Практическое задание: перенаправление потоков ввода/вывода

    1. Активируйте параметр командной оболочки noclobber .

    2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

    3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

    4. Деактивируйте параметр noclobber .

    5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

    6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

    Читайте также:  Окна не закрываются что делать windows

    Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода

    1. Активируйте параметр командной оболочки noclobber .

    2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

    3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

    4. Деактивируйте параметр noclobber .

    5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

    6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

    Источник

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

    Встроенные возможности перенаправления в Linux предоставляют вам широкий набор инструментов, используемых упрощения для всех видов задач. Умение управлять различными потоками ввода-вывода в значительно увеличит производительность, как при разработке сложного программного обеспечения, так и при управлении файлами с помощью командной строки.

    Потоки ввода-вывода

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

    • Стандартный ввод (standard input, stdin, поток номер 0)
    • Стандартный вывод (standard output, stdout, номер 1)
    • Стандартная ошибка, или поток диагностики (standard error, stderr, номер 2)

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

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

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

    Чтобы увидеть, как работает стандартный ввод, запустите программу cat. Название этого инструмента означает «concatenate» (связать или объединить что-либо). Обычно этот инструмент используется для объединения содержимого двух файлов. При запуске без аргументов cat открывает командную строку и принимает содержание стандартного ввода.

    Теперь введите несколько цифр:

    Вводя цифру и нажимая enter, вы отправляете стандартный ввод запущенной программе cat, которая принимает эти данные. В свою очередь, программа cat отображает полученный ввод в стандартном выводе.

    Пользователь может задать EOF, нажав ctrl-d, после чего программа cat остановится.

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

    Стандартный вывод записывает данные, сгенерированные программой. Если стандартный выходной поток не был перенаправлен, он выведет текст в терминал. Попробуйте запустить следующую команду для примера:

    echo Sent to the terminal through standard output

    Команда echo без дополнительных опций отображает на экране все аргументы, переданные ей в командной строке.

    Теперь запустите echo без аргументов:

    Команда вернёт пустую строку.

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

    Этот стандартный поток записывает ошибки, создаваемые программой, которая вышла из строя. Как и стандартный вывод, этот поток отправляет данные в терминал.

    Рассмотрим пример потока ошибок команды ls. Команда ls отображает содержимое каталогов.

    Без аргументов эта команда возвращает содержимое текущего каталога. Если указать в качестве аргумента ls имя каталога, команда вернёт его содержимое.

    Поскольку каталога % не существует, команда вернёт стандартную ошибку:

    ls: cannot access %: No such file or directory

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

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

    Команды с одной угловой скобкой переписывают существующий контент целевого файла:

    • > – стандартный вывод
    • – стандартная ошибка

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

    • >> – стандартный вывод
    • > – стандартная ошибка

    Рассмотрим следующий пример:

    cat > write_to_me.txt
    a
    b
    c
    ctrl-d

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

    Просмотрите содержимое write_to_me.txt:

    Команда должна вернуть:

    Снова перенаправьте cat в файл write_to_me.txt и введите три цифры.

    cat > write_to_me.txt
    1
    2
    3
    ctrl-d

    Теперь проверьте содержимое файла.

    Команда должна вернуть:

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

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

    cat >> write_to_me.txt
    a
    b
    c
    ctrl-d

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

    Конвейеры

    Конвейеры (pipes) перенаправляют потоки вывода одной команды на вход другой. При этом данные, передаваемые второй программе, не отображаются в терминале. На экране данные появятся только после обработки второй программой.

    Читайте также:  Как включить рдп windows 10

    Конвейеры в Linux представлены вертикальной чертой.

    Такая команда передаст вывод ls (содержимое текущего каталога) программе less, которая отображает передаваемые ей данные построчно. Как правило, ls выводит содержимое каталогов подряд, не разбивая на строки. Если перенаправить вывод ls в less, то последняя команда разделит вывод на строки.

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

    Фильтры

    Фильтры – это команды, которые могут изменить перенаправление и вывод конвейера.

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

    • find – выполняет поиск файла по имени.
    • grep – выполняет поиск текста по заданному шаблону.
    • tee – перенаправляет стандартный ввод в стандартный вывод и один или несколько файлов.
    • tr – поиск и замена строк.
    • wc – подсчёт символов, строк и слов.

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

    Теперь, когда вы ознакомились с основными понятиями и механизмами перенаправления, рассмотрим несколько базовых примеров их использования.

    команда > файл

    Такой шаблон перенаправляет стандартный вывод команды в файл.

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

    команда > /dev/null

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

    Такая команда сбрасывает стандартный выходной поток, возвращаемый командой ls, передав его в /dev/null.

    команда 2 > файл

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

    mkdir » 2> mkdir_log.txt

    Эта команда перенаправит ошибку, вызванную неверным именем каталога, и запишет её в log.txt. Обратите внимание: ошибка по-прежнему отображается в терминале.

    команда >> файл

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

    echo Written to a new file > data.txt
    echo Appended to an existing file’s contents >> data.txt

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

    команда 2>>файл

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

    find » 2> stderr_log.txt
    wc » 2>> stderr_log.txt

    Приведенная выше команда перенаправляет сообщение об ошибке, вызванное неверным аргументом find, в файл stderr_log.txt, а затем добавляет в него сообщение об ошибке, вызванной недействительным аргументом wc.

    команда | команда

    Этот шаблон перенаправляет стандартный выход первой команды на стандартный вход второй команды.

    find /var lib | grep deb

    Эта команда ищет в каталоге /var и его подкаталогах имена файлов и расширения deb и возвращает пути к файлам, выделяя шаблон поиска красным цветом.

    команда | tee файл

    Такой шаблон перенаправляет стандартный вывод команды в файл и переписывает его содержимое, а затем отображает перенаправленный выход в терминале. Если указанного файла не существует, он создает новый файл.

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

    wc /etc/magic | tee magic_count.txt

    Такая команда передаёт количество символов, строк и слов в файле magic (Linux использует его для определения типов файлов) команде tee, которая отправляет эти данные в терминал и в файл magic_count.txt.

    команда | команда | команда >> файл

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

    | grep *tar | tr e E >> ls_log.txt

    Такая команда отправляет вывод ls для каталога root команде grep. В свою очередь, grep ищет в полученных данных файлы tar. После этого результат grep передаётся команде tr, которая заменит все символы е символом Е. Полученный результат будет добавлен в файл ls_log.txt (если такого файла не существует, команда создаст его автоматически).

    Заключение

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

    Чтобы узнать больше о какой-либо команде, используйте:

    man command | less

    Такая команда вернёт полный список команд для tee.

    Источник

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