Як запустити команду у фоновому режимі без виводу, якщо не було помилки?
Якщо ви зайнята людина, то останнє, що вам потрібно, це турбувати величезну кількість "непотрібних" повідомлень, так як ви заспокоюєте речі? Сьогоднішня посада SuperUser Q&A має великі відповіді, які допоможуть читачеві заспокоїти обсяг виходу.
Сьогоднішня сесія запитань та відповідей приходить до нас люб'язно SuperUser - підрозділ Stack Exchange, групування веб-сайтів із запитаннями та відповідями на рівні спільноти..
Питання
Читач SuperUser Xster хоче знати, як виконати команду у фоновому режимі без виводу, якщо не сталася помилка:
Як ви пригнічуєте вихід команди, але показуєте, якщо вихід команди кодує помилку?
Як ви отримуєте команду для запуску у фоновому режимі без виводу, якщо не було помилки?
Відповідь
Співробітники SuperUser Боб і Максиміліан Лауместер мають відповідь для нас. Спочатку, Боб:
На жаль, це припущення stderr використовується тільки для виведення помилок не завжди правильно. Швидше, stderr часто використовується для будь-якого інтерактивного виводу та діагностики (тобто вихід, призначений для читання користувачем в інтерактивному запиті).(1) wget і dd добре відомі приклади.
Деякі команди забезпечують прапор (тобто. -спокійно або -мовчать) для припинення виведення помилок. Прочитайте їхні сторінки, щоб побачити, чи існує він.
Ще однією конвенцією, яка виконується частіше, є код виходу, програма повертає код виходу, коли він виходить. Як правило(2), код виходу 0 вказує на успіх, а будь-який інший код виходу вказує на помилку.
С bash, Ви можете отримати код виходу останньої команди з $? змінної. В риба, використовувати $ status змінної. Можна патрулювати stderr до тимчасового файлу і друкувати лише у разі виникнення помилки. Наприклад (риба):
Можна також використовувати деякі комбінації клавіш, якщо ви не з'єднуєте команди:
Або:
Можна також проколювати stdout в той же буфер, використовуючи 2> & 1> / tmp / outputbuffer.
(Примітка: Я насправді не знаю риба, тому я адаптую концепцію до того, що я можу знайти в її документації. Синтаксис може бути трохи неправильним. Також можна використовувати mktemp для створення унікального тимчасового файлу. Запустіть його та запишіть ім'я файлу в змінну.)
Якщо вам потрібно запустити все це на тлі оболонки, яку ви також використовуєте в інтерактивному режимі одночасно, то краще писати скрипт, щоб обробляти приховування виводу і запускати цей сценарій у фоновому режимі зі стандартними методами. (риба). Чорт, ви можете поставити щось подібне до наступної функції в ~ / .config / fish / config.fish:
Телефонуйте за допомогою мовчазна команда (де трейлінг & призводить до запуску у фоновому режимі)
Зауважте, що це призведе до проковтування оригінального коду виходу та скидання обох stdout і stderr у разі невдачі. За потреби можна налаштувати його.
(1) Немає гарантії, що вихід помилки не з'явиться stdout, деякі програми скидають всі вихідні дані!
(2) На жаль, це все ще не завжди. Код виходу повністю контролюється програмою, а деякі вказують на деякі умови успіху з ненульовими виходами. Знову перевірте посібник.
Далі йшла відповідь від Maximillian Laumeister:
Утиліти Unix надсилають загальні повідомлення stdout, та повідомлення про помилки stderr, тому, якщо ми хочемо бачити лише повідомлення про помилки, то цього буде достатньо для придушення stdout так що тільки stderr виводиться на консоль.
Шлях зробити це (в обох bash і риба) додавати > / dev / null до команди. Це труби stdout в ніщо, але stderr (з повідомленнями про помилки) все ще надходить до консолі.
Так, наприклад:
Команда echo 1> / dev / null нічого не друкує, тому що нормальний stdout висновок придушується, і нічого не записується stderr.
Команда man doesnotexist> / dev / null друкує повідомлення про помилку, оскільки людина пише своє повідомлення про помилку stderr.
Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.