Як перенаправити вихід будь-якої команди?


14

Я намагаюся написати простий скрипт для моніторингу стану моєї мережі без всіх pingрезультатів:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Проблема полягає в тому, що коли я не підключений, я все одно отримую повідомлення про помилку у своєму виході:

ping: unknown host google.com
offline

Як я можу зберегти це повідомлення про помилку з мого виходу?

Відповіді:


28

Під час запуску:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Ви по суті лише переспрямовуєте вихід потоку 1 (тобто stdout) на /dev/null.

Це добре, коли ви хочете перенаправити висновок, отриманий при звичайному виконанні програми. Однак у випадку, якщо ви також хочете перенаправити результат, викликаний усіма помилками, попередженнями або збоями, вам слід також переспрямувати stderrпотік або потік Standard Error на /dev/null.

Одним із способів цього є попередження номера потоку, який ви хочете перенаправити до оператора перенаправлення, >як це:Command 2> /dev/null

Отже, ваша команда виглядатиме так:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

Але зауважте, що ми вже перенаправили один потік на /dev/null. Чому б просто не переробити на одне перенаправлення? Bash дозволяє нам це зробити, вказавши номер потоку, на який слід перенаправити. 2>&1.

Помітьте &символ після оператора перенаправлення. Це говорить оболонці, що наступне з’являється не ім'я файлу, а ідентифікатор вихідного потоку.

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

Будьте обережні з операторами переадресації, їх порядок має велике значення. Якщо ви повинні були переспрямувати в неправильному порядку, ви отримаєте несподівані результати.

Ще один спосіб досягнення цілковитої тиші - перенаправлення всіх вихідних потоків на/dev/null використання цього ярлика: &>/dev/null(або перенаправлення на файл журналу з &>/path/to/file.log).

Отже, напишіть свою команду так:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
Ага &>/dev/nullце. Дякую всім за миттєву допомогу!
опералала

4
Be careful with the redirection operators, their order matters a lot., але ви не включили приклад фактичного використання2>&1
Ізката

Я забув додати це! Відредагована відповідь, щоб відобразити приклад. Коли у мене ще трохи часу на руках, я поясню, як працює також замовлення.
darnir

9

Вам потрібно переспрямувати як стандартний вихід ( >або 1>), так і стандартну помилку ( 2>):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

або перенаправити один на інший:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

Приклади

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

Прискорення пінг

Залежно від вашої pingреалізації, ви можете обмежитися однією кількістю -c 1. Деякі реалізації дозволять вам опуститись нижче цього, але вам, по суті, доведеться чекати поганих результатів пошуку до часу очікування. Отже, замість того, щоб використовувати ping, можливо, ви хочете використовувати це fingзамість

повільність провалу пінгу

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

фінг набагато швидше провалюється

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
Я вважаю за краще використовувати timeкоманду, ніж вручну обчислювати різницю в часі з date:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Руслан

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