Что такое /dev/null 2> & 1?

Я нашел этот фрагмент кода в /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Это очистка и перезагрузка брандмауэра.
Я не понимаю часть >> /dev/null 2>&1.

Какова цель иметь это в cron? Это отменяет мои правила брандмауэра. Могу ли я безопасно удалить эту работу cron?

Ответ 1

>> /dev/null перенаправляет стандартный вывод (stdout) на /dev/null, который отбрасывает его.

(>> кажется излишним, поскольку >> означает append while > означает truncate и write, а добавление или запись в /dev/null имеет тот же эффект сети. Обычно я использую > по этой причине.)

2>&1 перенаправляет стандартную ошибку (2) на стандартный вывод (1), который затем отбрасывает его, так как стандартный вывод уже перенаправлен.

Ответ 2

Это способ выполнить программу спокойно и скрыть все ее выходные данные.

/dev/null - специальный объект файловой системы, который отбрасывает все, что записано в нем. Перенаправление потока в него означает скрытие вывода.

Часть 2>&1 означает "перенаправить выходные и потоки ошибок". Даже если ваша программа записывается в stderr, этот вывод не будет отображаться.

Ответ 3

Позволяет разделить оператор >> /dev/null 2>&1 на части:


Часть 1: >> перенаправление вывода

Это используется для перенаправления вывода программы и добавления вывода в конец файла. Подробнее...


Часть 2: /dev/null специальный файл

Это Специальный файл псевдо-устройств.

Команда ls -l /dev/null предоставит вам сведения об этом файле:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

Вы наблюдали crw? Это означает, что это файл псевдоустройства, который имеет тип character-special-file, который обеспечивает последовательный доступ.

/dev/null принимает и отбрасывает все входные данные; не производит выход (всегда возвращает индикацию конца файла при чтении). Ссылка: Wikipedia


Часть 3: 2>&1 дескриптор файла

Всякий раз, когда вы запускаете программу по умолчанию, открывайте три файла STDIN, STDOUT и STDERR, как мы знаем, когда файл открывается, система возвращает небольшое целое, называемое файловым дескриптором. Дескриптор файла для этих файлов равен 0, 1, 2 соответственно.

Итак 2>&1 просто говорит перенаправление STDERR на STDOUT

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

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

В чем важность использования 2>&1?

Если вы хотите произвести вывод даже в случае некоторой ошибки в терминале. Чтобы объяснить, давайте рассмотрим следующий пример:

$ ls -l > /dev/null

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

$ ls -l file_doesnot_exists > /dev/null 
ls: cannot access file_doesnot_exists: No such file or directory

Даже если я перенаправляю вывод на /dev/null, он печатается в терминал. Это связано с тем, что мы не перенаправляем вывод ошибки на /dev/null, поэтому для перенаправления ошибок также необходимо добавить 2>&1

$ ls -l file_doesnot_exists > /dev/null 2>&1

Ответ 4

/dev/null - стандартный файл, который отбрасывает все, что вы пишете на него, но сообщает  что операция записи выполнена успешно. 1 - это stdout, а 2 - stderr. 2>&1 перенаправляет stderr в stdout. &1 указывает дескриптор файла (stdout), в противном случае (если вы используете только 1), вы перенаправите stderr в файл с именем 1. [any command] >>/dev/null 2>&1 перенаправляет все stderr на stdout и записывает все это в /dev/null.

Ответ 5

Я использую >> /dev/null 2>&1 для молчания cronjob, cronjob выполнит эту работу, но не отправит отчет на мой адрес электронной почты.

Насколько я знаю, не удаляйте /dev/null, он особенно полезен при запуске cpanel, который можно использовать для отбрасывания отчета cronjob.

Ответ 6

Как описано другими, запись в /dev/null исключает вывод программы. Обычно cron отправляет электронное письмо для каждого вывода процесса, начинающегося с cronjob. Таким образом, записывая вывод в /dev/null, вы запрещаете спам, если вы указали свой адрес в cron.

Ответ 7

Изменить /etc/conf.apf. Установите DEVEL_MODE="0". DEVEL_MODE, установленный в 1, добавит задание cron для остановки apf через 5 минут.