Не выводить результат команды linux

Перенаправление ввода/вывода в 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.

Читайте также:  Windows 10 отключить защитник windows политика

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

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

Пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Для завершения цикла нажмите сочетание клавиш 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.
    Читайте также:  Как создать csv файл mac os

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

    Пример

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

    Пример

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

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

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

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

    Заключение

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

    Источник

    Операторы перенаправления вывода в Bash: что означает &1 и другие

    Рассмотрим операторы перенаправления вывода Bash и похожие по функции операторы и конструкции. Я собрал следующий список, если что-то пропустил, то пишите в комментариях:

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

    Символ > используется для перенаправления вывода в файл, например:

    В этом примере вывод команды ls -l будет записан в файл dir.txt.

    То есть оператор | используется когда вывод передаётся в другую команду, а оператор > используется когда вывод записывается в файл.

    Ещё один пример использования сразу обоих операторов:

    Результат работы этой последовательности команд будет сохранён в файл num.txt.

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

    > /dev/null

    Это частный случай перенаправления, когда всё из стандартного вывода перенаправляется в псевдоустройство /dev/null. Это означает уничтожение данные. То есть ничего не будет выводиться в стандартный вывод.

    Функция оператора >> похожа на > с тем отличием, что оператор >> не удаляет содержимое файла, а дописывает новые данные к уже существующим.

    Если файл не существует, то оператор >> создаст его и запишет в него переданные данные.

    Читайте также:  Домашняя группа windows 10 подключить телевизор

    Оператор 2> перенаправляет стандартный вывод ошибок — standard error (stderr).

    Результат выполнения команд и возникшие ошибки выводятся на консоль и может показаться, что это одно и то же. Но на самом деле, это разные типы вывода.

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

    Текст ошибки будет выведен на экран, но файл ls-error.txt окажется пустым.

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

    В данном случае ошибка не будет выведена на экран, а будет сохранена в файл ls-error.txt.

    Чтобы перенаправить стандартную ошибку, мы должны обратиться к её файловому дескриптору. Программа может выводить любой из нескольких пронумерованных файловых потоков. Первые три из этих файловых потоков называются стандартный ввод, стандартный вывод и стандартный вывод ошибок. Оболочка ссылается на них внутренне как файловые дескрипторы 0, 1 и 2 соответственно. Оболочка обеспечивает запись для перенаправления файлов с использованием номера дескриптора файла. Поскольку стандартная ошибка совпадает с дескриптором файла номер 2, мы можем перенаправить стандартную ошибку с помощью 2>.

    Файловый дескриптор «2» помещается непосредственно перед оператором перенаправления, чтобы выполнить перенаправление стандартной ошибки в файл ls-error.txt.

    Конструкция 2>&1 предназначена для перенаправления стандартного вывода и стандартного вывода ошибок в один файл.

    В некоторых случаях мы можем захотеть записать весь вывод команды в один файл. Чтобы сделать это, мы должны одновременно перенаправить как стандартный вывод, так и стандартный вывод ошибок. Есть два способа сделать это. Во-первых, традиционный способ, который работает со старыми версиями оболочки:

    Используя этот метод, мы выполняем два перенаправления. Сначала мы перенаправляем стандартный вывод в файл ls-output.txt, а затем перенаправляем дескриптор файла 2 (стандартная вывод ошибок) на дескриптор файла один (стандартный вывод), используя обозначения 2>&1.

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

    перенаправляет стандартную ошибку в файл ls-output.txt, но при изменении порядка на

    стандартная ошибка направлена на экран.

    Последние версии bash предоставляют второй, более упрощённый метод для выполнения комбинированного перенаправления 2>&1:

    В этом примере мы используем одинарную запись &> для перенаправления как стандартного вывода, так и стандартной ошибки в файл ls-output.txt.

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

    Итак, &> является аналогом 2>&1, а &>> это то же самое, но с перенаправлением вывода в файл.

    Это ещё одна форма «подстановки процессов» (Process Substitution):

    Если используется эта форма, то вместо записи в файл, данные будут переданы на ввод для КОМАНДЫ.

    >(КОМАНДА) > /dev/null

    Эка комбинация, включающая в себя 3 уже рассмотренных элемента:

    • 2> означает перенаправление стандартного вывода ошибок (stderr)
    • >(КОМАНДА) означает подстановку процессов, в результате стандартный вывод ошибок будет передан для обработки в КОМАНДУ
    • > /dev/null означает перенаправления стандартного вывода в /dev/null, то есть фактическое уничтожение стандартного вывода

    Пример практического использования:

    HTTP заголовки команда cURL выводит в stderr, а команда grep не ищет по stderr. Но если мы хотим искать только по HTTP заголовков (игнорируя HTML код), то мы не может сделать просто перенаправление stderr для слияния со стандартным выводом, то есть не можем 2>&1, поскольку текст страницы может содержать фразу «401 Unauthorized» и мы получим ложное срабатывание. Поэтому мы используем указанную выше конструкцию — стандартный вывод ошибок обрабатывается, стандартный вывод уничтожается.

    cat > ФАЙЛ (перенаправление вывода в файл)
  • > ФАЙЛ > (перенаправление вывода в файл с дописыванием данных)
  • ФАЙЛ
  • Данная конструкция получает многострочный ввод по стандартному вводу и сохраняет его в файл. То есть это аналог

    в котором просто операторы поменяны местами.

    Источник

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