- Что такое /dev/null и как его использовать в Bash
- Предварительно
- Использование /dev/null
- Перенаправление вывода в /dev/null
- Перенаправить весь вывод в /dev/null
- Другие примеры
- How to redirect the output of an application in background to /dev/null
- 2 Answers 2
- Операторы перенаправления вывода в Bash
- Операторы перенаправления вывода в Bash: что означает &1 и другие
- > /dev/null
- 2>
- 2>&1
Что такое /dev/null и как его использовать в Bash
Linux — это интересная операционная система, в которой размещены некоторые виртуальные устройства для различных целей. Для программ, работающих в системе, эти виртуальные устройства действуют так, как будто это реальные файлы. Инструменты могут запрашивать и получать данные из этих источников. Данные генерируются ОС вместо того, чтобы считывать их с диска. Одним из таких примеров является /dev/null . Это специальный файл, который присутствует в каждой системе Linux. Однако, в отличие от большинства других виртуальных файлов, вместо чтения он используется для записи. Все, что вы запишете в /dev/null , будет отброшено, забыто в пустоте. В системе UNIX он известен как нулевое устройство. Зачем вам выбрасывать что-то в пустоту? Давайте посмотрим, что такое /dev/null и как он используется.
Предварительно
Прежде чем углубиться в использование /dev/null , мы должны иметь четкое представление о потоке данных stdout и stderr . Ознакомьтесь с этим коротким руководством по stdin, stderr и stdout.
Давайте сделаем небольшое уточнение. При запуске любой утилиты командной строки она генерирует два вывода. Вывод идет на stdout , а ошибка (если она возникла) — на stderr . По умолчанию оба этих потока данных связаны с терминалом.
Например, следующая команда выведет строку, заключенную в двойные кавычки. Здесь вывод сохраняется в stdout .
Следующая команда покажет нам статус выхода ранее запущенной команды.
Поскольку предыдущая команда была выполнена успешно, статус выхода равен 0. В противном случае статус выхода будет другим. Что произойдет, если вы попытаетесь выполнить недопустимую команду?
Теперь нам нужно разобраться в файловом дескрипторе. В экосистеме UNIX это целочисленные значения, присвоенные файлу. И stdout , и stderr имеют определенный дескриптор файла: stdout = 1 , stderr = 2 . Используя дескриптор файла (1 и 2), мы можем перенаправить stdout и stderr в другие файлы.
Cледующий пример перенаправит stdout команды echo в текстовый файл. Здесь мы не указали дескриптор файла. Если он не указан, bash будет использовать stdout по умолчанию.
Следующая команда перенаправит stderr в текстовый файл.
Использование /dev/null
Перенаправление вывода в /dev/null
Теперь мы готовы узнать, как использовать /dev/null . Сначала давайте проверим, как фильтровать обычный вывод и ошибки. В следующей команде grep попытается найти строку (hello, в данном случае) в каталоге «/sys».
Однако это вызовет множество ошибок, поскольку без привилегий root grep не может получить доступ к ряду файлов. В этом случае он выдаст ошибку «Permission denied». Теперь, используя перенаправление, мы можем получить более четкий результат.
$ grep -r hello /sys/ 2> /dev/null
Вывод выглядит намного лучше, верно? Ничего! В этом случае у grep нет доступа ко многим файлам, а в тех, что есть, нет строки «hello».
В следующем примере мы будем пинговать Google.
Однако мы не хотим видеть все эти успешные результаты пинга. Вместо этого мы хотим сосредоточиться только на ошибках, когда ping не смог достичь Google. Как нам это сделать?
Здесь содержимое stdout сбрасывается в /dev/null , оставляя только ошибки.
Перенаправить весь вывод в /dev/null
В некоторых ситуациях вывод может оказаться бесполезным. Используя перенаправление, мы можем сбросить весь вывод в пустоту.
$ grep -r hello /sys/ > /dev/null 2>&1
Давайте немного разобьем эту команду. Сначала мы сбрасываем весь stdout в /dev/null . Затем, во второй части, мы говорим bash отправить stderr в stdout . В этом примере выводить нечего. Однако, если вы запутались, вы всегда можете проверить, успешно ли выполнилась команда.
Значение равно 2, потому что команда выдала много ошибок.
Если вы склонны забывать файловый дескриптор stdout и stderr, следующая команда подойдет как нельзя лучше. Это более обобщенный формат предыдущей команды. И stdout, и stderr будут перенаправлены в /dev/null.
$ grep -r hello /sys/ &> /dev/null
Другие примеры
Это интересный пример. Знаете инструмент dd ? Это мощный инструмент для преобразования и копирования файлов. Узнайте больше о dd . Используя dd , мы можем проверить скорость последовательного чтения вашего диска. Конечно, это не точное измерение. Однако для быстрого теста это довольно полезно.
$ dd if= of=/dev/null status=progress bs=1M iflag=direct
Здесь я использовал Ubuntu 18.04.4 ISO в качестве большого файла.
Аналогичным образом вы также можете проверить скорость загрузки вашего интернет-соединения.
Надеемся, у вас есть четкое понимание того, что такое файл /dev/null. Это специальное устройство, которое при записи в него отбрасывает, а при чтении из него считывает null. Истинный потенциал этой интересной возможности заключается в интересных bash-скриптах.
How to redirect the output of an application in background to /dev/null
I would like to redirect the output generated from a background application in Linux to /dev/null. I am using kate text editor and it prints all the debug messages on the terminal which I would like to redirect to /dev/null. Any idea how to do it ? Thanks
2 Answers 2
If it should run in the Background add an &
>/dev/null 2>&1 means redirect stdout to /dev/null AND stderr to the place where stdout points at that time
If you want stderr to occur on console and only stdout going to /dev/null you can use:
In this case stderr is redirected to stdout (e.g. your console) and afterwards the original stdout is redirected to /dev/null
If the program should not terminate you can use:
Without any parameter all output lands in nohup.out
If this is the last command in a bash file, one thing that I noticed is that it leaves the command console that called the file without a prompt.
@elig redirecting output of an already running application is not possible imo, or at least not that easily, because the redirection via dup2() happens immediately after fork() but before exec*() . Once exec*() has executed the program, the shell has not the capability to redirect the output of that process. Correct me if I am wrong, but I don’t know about a shell that has implemented such functionality.
What is the difference between yourcommand 2>&1 > /dev/null and yourcommand > /dev/null ? Both seem to redirect stderr to stdout .
Операторы перенаправления вывода в Bash
Операторы перенаправления вывода в Bash: что означает &1 и другие
Рассмотрим операторы перенаправления вывода Bash и похожие по функции операторы и конструкции. Я собрал следующий список, если что-то пропустил, то пишите в комментариях:
Этот оператор на английском называется pipe, и на русском его называют труба или конвейер. Используется очень часто для перенаправления вывода из одной команды в другую, которая может принимать стандартный вывод. Например:
echo 'Строка с числом 901255323' | grep -E -o '8+'
Символ > используется для перенаправления вывода в файл, например:
В этом примере вывод команды ls -l будет записан в файл dir.txt.
То есть оператор | используется когда вывод передаётся в другую команду, а оператор > используется когда вывод записывается в файл.
Ещё один пример использования сразу обоих операторов:
echo 'Строка с числом 901255323' | grep -E -o '1+' > num.txt
Результат работы этой последовательности команд будет сохранён в файл num.txt.
Если файл не существует, то он будет создан. Если файл существует, то оператор > полностью удалит его содержимое и запишет новым.
> /dev/null
Это частный случай перенаправления, когда всё из стандартного вывода перенаправляется в псевдоустройство /dev/null. Это означает уничтожение данные. То есть ничего не будет выводиться в стандартный вывод.
Функция оператора >> похожа на > с тем отличием, что оператор >> не удаляет содержимое файла, а дописывает новые данные к уже существующим.
Если файл не существует, то оператор >> создаст его и запишет в него переданные данные.
2>
Оператор 2> перенаправляет стандартный вывод ошибок — standard error (stderr).
Результат выполнения команд и возникшие ошибки выводятся на консоль и может показаться, что это одно и то же. Но на самом деле, это разные типы вывода.
К примеру попытаемся сохранить в файл текст ошибки, возникшей в результате выполнения команды:
Текст ошибки будет выведен на экран, но файл ls-error.txt окажется пустым.
Дело в том, что нужно различать стандартный вывод и стандартный вывод ошибок. Чтобы перенаправить стандартный вывод в файл используется оператор 2>:
В данном случае ошибка не будет выведена на экран, а будет сохранена в файл ls-error.txt.
Чтобы перенаправить стандартную ошибку, мы должны обратиться к её файловому дескриптору. Программа может выводить любой из нескольких пронумерованных файловых потоков. Первые три из этих файловых потоков называются стандартный ввод, стандартный вывод и стандартный вывод ошибок. Оболочка ссылается на них внутренне как файловые дескрипторы 0, 1 и 2 соответственно. Оболочка обеспечивает запись для перенаправления файлов с использованием номера дескриптора файла. Поскольку стандартная ошибка совпадает с дескриптором файла номер 2, мы можем перенаправить стандартную ошибку с помощью 2>.
Файловый дескриптор «2» помещается непосредственно перед оператором перенаправления, чтобы выполнить перенаправление стандартной ошибки в файл ls-error.txt.
2>&1
Конструкция 2>&1 предназначена для перенаправления стандартного вывода и стандартного вывода ошибок в один поток, который затем может быть перенаправлен в единый файл.
В некоторых случаях мы можем захотеть записать весь вывод команды в один файл. Чтобы сделать это, мы должны одновременно перенаправить как стандартный вывод, так и стандартный вывод ошибок. Есть два способа сделать это. Во-первых, традиционный способ, который работает со старыми версиями оболочки:
ls -l /bin/usr > ls-output.txt 2>&1
Используя этот метод, мы выполняем два перенаправления. Сначала мы перенаправляем стандартный вывод в файл ls-output.txt, а затем перенаправляем дескриптор файла 2 (стандартная вывод ошибок) на дескриптор файла один (стандартный вывод), используя обозначения 2>&1.
Обратите внимание, что порядок перенаправлений является значимым. Перенаправление стандартной ошибки всегда должно происходить после перенаправления стандартного вывода, иначе оно не работает. В приведённом выше примере
перенаправляет стандартную ошибку в файл ls-output.txt, но при изменении порядка на
стандартная ошибка направлена на экран.
Последние версии bash предоставляют второй, более упрощённый метод для выполнения комбинированного перенаправления 2>&1:
В этом примере мы используем одинарную запись &> для перенаправления как стандартного вывода, так и стандартной ошибки в файл ls-output.txt.
Вы также можете добавить стандартные выходные данные и стандартные потоки ошибок в один файл, например так:
Итак, &> является аналогом 2>&1, а &>> это то же самое, но с перенаправлением вывода в файл.
Как мы уже рассмотрели выше, символ > является перенаправлением вывода. Что касается символа , то он перенаправляет ввод. Используется следующим образом:
В этом случае КОМАНДА1 будет выполнена с ФАЙЛ1 в качестве источника ввода вместо клавиатуры, которая является обычным источником стандартного ввода.
Ещё один пример, содержимое файла math.txt:
Тогда следующие команды идентичны:
и нажать Enter, то переменной a будет присвоено значение «строка» и вновь станет доступно приглашение командной строки, потому что Enter по умолчанию является разделителем, символом новой строки. Из-за этого не получится ввести многострочное значение.
Второй ввод _EOF_ + Enter означает конец многострочных данных. После этого будет выполнена команда, то есть будут выведены введённые цифры:
Если вы хотите переменной присвоить многострочное значение, то это можно сделать примерно так:
Выведем значение переменной:
Here document это весьма полезная конструкция, к примеру, с её помощью можно делать шаблоны текста, меню, выводимых данных:
#!/bin/bash userName="MiAl (Alex)" site=ZaLinux.ru status=admin catUser: MiAl (Alex) Web-site: ZaLinux.ru Role: admin