Что такое / dev / null и чем он может вам помочь?

Если у нас уже есть какое-то представление о дереве каталогов GNU / Linux, мы должны, по крайней мере, быть знакомы со ссылкой / dev /, где фактически находятся все файлы, относящиеся к аппаратные устройства.

Если мы заглянем в каталог / dev / мы увидим "файл" под названием нуль, но если мы хотим открыть его, чтобы увидеть его содержимое, система сообщит нам, что это невозможно, поскольку это не обычное содержимое. Я заключил слово файл, потому что, как вы все знаете, для Linux все (оборудование и программное обеспечение) представлено в виде файла.

Это вклад Даниэля Дюранте, который стал одним из победителей нашего еженедельного конкурса: «Поделитесь своими знаниями о Linux«. Поздравляю, Даниил!

Какому устройству соответствует / dev / null?

Для практических целей представьте мусорное ведро, бездонную яму или космическое пространство, в которое можно бросить что-нибудь без возможности вернуть это (как бы ни старались ребята из НАСА).

Но если у меня уже есть такие команды, как rm, зачем мне удалять что-то новое?

Поскольку обе «черные дыры» работают совершенно по-разному: как бы вы переопределили стандартный вывод ошибки в команде в сценарии оболочки во время выполнения? Здесь на помощь приходит / dev / null.

Посмотрим на это на примере.

Мы создали файл с именем tests, содержащий строку «Hello World». Если мы хотим представить содержимое этого файла в командной строке, мы могли бы сделать это следующим образом:

пользователь @ ноутбук: ~ $ cat test
Привет, мир

Если бы файл не существовал или был назван тестом (с буквой s в конце), мы получили бы следующую ошибку в консоли:

пользователь @ ноутбук: ~ $ cat тесты
cat: tests: файл или каталог не существует

Что мы могли сделать, чтобы избежать сообщения об ошибке? Ну, просто перенаправьте вывод команды в случае ошибки в «мусорное ведро», то есть в / dev / null

Как указать, что это будет в случае ошибки? Здесь вы вводите стандартные значения ввода, вывода и ошибок для программы: STDIN, STDOUT и STDERR (которые могут быть заменены на 0, 1 и 2 соответственно). Таким образом, если мы положим ...

пользователь @ ноутбук: ~ $ cat tests 2> / dev / null
пользователь @ ноутбук: ~ $

… Мы увидим, что сообщение об ошибке не выводится на консоль.

Вы должны быть осторожны, потому что синтаксис очень важен: между символами 2 и> не должно быть пробелов. В противном случае это дало бы следующее:

пользователь @ ноутбук: ~ $ cat tests 2> / dev / null
cat: tests: файл или каталог не существует
cat: 2: файл или каталог не существует

Напротив, пробел между> и / dev / null не повлияет отрицательно на результат.

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

пользователь @ ноутбук: ~ $ cat tests 2> err.log

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

пользователь @ ноутбук: ~ $ cat test 1> output_result 2> err.log

Наконец, стоит поставить выражение «> / dev / null 2> & 1», в котором объединены стандартный вывод и вывод ошибок, перенаправляя их так, чтобы ни в коем случае не была получена информация вывода.