Linux error output to null

Что такое /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.

Читайте также:  Hp 260 g2 linux

Однако мы не хотим видеть все эти успешные результаты пинга. Вместо этого мы хотим сосредоточиться только на ошибках, когда 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 Output to /dev/null in Linux

In Linux, programs are very commonly accessed using the command line and the output, as such, is displayed on the terminal screen. The output consists of two parts: STDOUT (Standard Output), which contains information logs and success messages, and STDERR (Standard Error), which contains error messages.

Many times, the output contains a lot of information that is not relevant, and which unnecessarily utilizes system resources. In the case of complex automation scripts especially, where there are a lot of programs being run one after the other, the displayed log is huge.

In such cases, we can make use of the pseudo-device file ‘/dev/null‘ to redirect the output. When the output is redirected to /dev/null, it is immediately discarded, and thus, no resource utilization takes place.

Let’s see how to redirect output to /dev/null in Linux.

Let us take an example of the mv command trying to move two files to a particular directory, where one file is moved successfully (displays STDOUT) and the other gives an error while moving (displays STDERR).

$ mv -v tmp.c /etc/apt/sources.list /tmp

Move Multiple Files in Linux

Note: The ‘-v’ argument to mv displays the success log when a file is moved. Without the flag, nothing is printed to STDOUT.

Now, to redirect only the STDOUT to /dev/null, i.e. to discard the standard output, use the following:

$ mv -v tmp.c /etc/apt/sources.list /tmp 1>/dev/null

Redirect STDOUT to /dev/null

What does ‘1>/dev/null’ mean?

Here ‘1’ indicates STDOUT, which is a standard integer assigned by Linux for the same. The operator ‘>’ , called a redirection operator, writes data to a file. The file specified in this case is /dev/null. Hence, the data is ultimately discarded.

Читайте также:  What is 755 in linux

If any other file were given instead of /dev/null, the standard output would have been written to that file.

Similarly, to redirect only the STDERR to /dev/null, use the integer ‘2’ instead of ‘1’ . The integer ‘2’ stands for standard error.

$ mv -v tmp.c /etc/apt/sources.list /tmp 2>/dev/null

Redirect STDERR Output to /dev/null

As you can see, the standard error is not displayed on the terminal now as it is discarded in /dev/null.

Finally, to discard both STDOUT and STDERR at the same time, use the following:

$ mv -v tmp.c /etc/apt/sources.list /tmp &>/dev/null

Redirect STDOUT and STDERR Output to /dev/null

The ampersand character (‘&’) denotes that both the standard output and standard error has to be redirected to /dev/null and discarded. Hence, in the last screenshot, we do not see any output printed on the screen at all.

Conclusion

In this article, we have seen how to redirect output to /dev/null. The same can be used in either command or in complex Bash scripts which generate a heavy amount of log. In case if the script needs debugging, or has to be tested; in such cases, the log is required to view and analyze the errors properly.

However in cases when the output is already known and anticipated, it can be discarded with /dev/null. If you have any questions or feedback, let us know in the comments below!

Источник

How to Redirect Output and Error to /dev/null in Linux

Learn how to redirect output or error or both to /dev/null in Linux so that it doesn’t show up on the screen.

Imagine this scenario. You run a Linux command and it has a huge output. You don’t want to see its output.

Or, you are using certain Linux commands in your script and you don’t want it to show any output or error on the terminal screen.

For such cases, you can take advantage of the output and error redirection and send them to /dev/null.

Send the output to /dev/null:

Send the error to /dev/null:

Send both output and error to /dev/null:

The /dev/null can be considered a black hole of the Linux file system so whatever you throw there can never see the light again.

Let’s take a detailed look here.

Redirect output to /dev/null in Linux

Let me start off with the basics. You type a command in the terminal is your input (let’s say I executed sudo apt update ).

So I gave input to my system and it will update the directories and it will show me the ongoing processes such as repositories being updated and packages that are outdated now:

In short, it gave the output showing what it did with the command. Now, here is the number designation for each standard data flow:

  • Standard input (stdin) is designated with 0
  • Standard output (stdout) is designated with 1
  • Standard error (stderr) is designated with 2
Читайте также:  Man top in linux

So now, let me show you how you can redirect standard output to the dev/null :

For example, I will intentionally use the find command which will show output with an error so as I redirect the output to /dev/null, the error should remain intact:

redirect output to dev null

As you can see, when I used the find command without redirecting the output, it showed output worth 1807 lines.

And when I redirected the output, it showed the errors only as it belongs to the standard error stream.

Redirect errors to /dev/null in Linux

As I mentioned earlier, the error stream is designated with 2. So you just have to make a few changes in the above command and you’d be good to go!

To redirect errors, you will have to use > symbol to redirect the data flow with the number 2 indicating it to redirect data flow on standard error.

For example, I will use sudo dnf update on Ubuntu so the error is obvious and on the second window, I will demonstrate how you can redirect the error:

redirect error to /dev/null in linux

Redirect both output and error to /dev/null in Linux

In this section, I will show you how you can redirect both output and the error to /dev/null.

The basic syntax for redirecting output and error to /dev/null is as follows:

command 1> /dev/null 2> /dev/null

Or you can also use the shorter version:

For this example, I will be using the find command to find files in the etc directory in which you’d need sudo privileges to access some sub-directors and when used without sudo, it will throw an error:

redirect output and error to /dev/null in linux

Wrapping Up

This was my take on how you can redirect the output and errors to /dev/null.

And if you want to learn more about redirecting data flow, I would highly recommend you the detailed guide on redirecting data flow in Linux.

Источник

How do I redirect errors to /dev/null in bash?

We run daily Selenium tests to test our website and extensions. I wrote a script (according to this question) to count the number of passed and failed tests. Here is the script:

#!/bin/bash today=`TZ='Asia/Tel_Aviv' date +"%Y-%m-%d"` yesterday=`TZ='Asia/Tel_Aviv' date +"%Y-%m-%d" -d "yesterday"` . print_test_results() < declare -i passed_tests=0 declare -i failed_tests=0 declare -i total_tests=0 log_suffix="_$.log" yesterday_logs="$$_[1,2]*$" today_logs="$$_0*$" for temp_file_name in $yesterday_logs $today_logs ; do total_tests+=1 if grep -q FAILED "$temp_file_name" ; then failed_tests+=1 elif grep -q OK "$temp_file_name" ; then passed_tests+=1 else failed_tests+=1 fi done echo "" echo "$test_name - $today" if [ $passed_tests = "0" ]; then echo "$passed_tests passed" echo "$failed_tests failed" else echo "$passed_tests passed" echo "$failed_tests failed" fi echo "$total_tests tests total" echo "" > file_name="chrome_gmail_1_with_extension_test" test_name="Chrome Gmail 1 With Extension Test" print_test_results . 

But the problem is, if the files are not there ( in $yesterday_logs $today_logs ), I get error messages. How do I redirect these error messages to /dev/null? I want to redirect them to /dev/null from the script, and not from the line calling the script — I want this script to never show error messages about files which don’t exist.

Источник

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