Домашняя » как » Как запустить команду в фоновом режиме без вывода, если нет ошибки?

    Как запустить команду в фоновом режиме без вывода, если нет ошибки?

    Если вы занятой человек, то последнее, что вам нужно, это возиться с огромным количеством «бесполезных» уведомлений, так как же вы успокаиваетесь? В сегодняшнем посте SuperUser Q & A есть несколько отличных ответов, которые помогут читателю снизить объемы производства..

    Сегодняшняя сессия вопросов и ответов пришла к нам благодаря SuperUser - подразделению Stack Exchange, группе веб-сайтов вопросов и ответов, управляемой сообществом..

    Вопрос

    Считыватель SuperUser Xster хочет знать, как выполнить команду в фоновом режиме без вывода, если только не произошла ошибка:

    Как вы подавляете вывод команды, но показываете, если выход команды кодирует ошибку?

    Как вы получаете команду для запуска в фоновом режиме без вывода, если нет ошибки?

    Ответ

    Авторы SuperUser Боб и Максимилиан Лаумейстер ответят за нас. Сначала Боб:

    К сожалению, предположение, что STDERR используется только для вывода ошибок не всегда правильно. Скорее, STDERR часто используется для любого и всех интерактивных выводов и диагностики (т.е. вывод, предназначенный для чтения пользователем в интерактивном режиме).(1) Wget а также дд хорошо известные примеры.

    Некоторые команды предоставляют флаг (т.е.. -тихо или же -бесшумный) для подавления вывода без ошибок. Прочтите их справочные страницы, чтобы узнать, существует ли он.

    Еще одна конвенция, которая проводится чаще, код выхода, программа возвращает код выхода при выходе. типично(2), код выхода 0 указывает на успех, а любой другой код завершения указывает на ошибку.

    С удар, Вы можете получить код выхода последней команды из $? переменная. В рыба, использовать $ статус переменная. Вы можете трубу STDERR во временный файл и распечатайте его только в случае возникновения ошибки. Например (рыба):

    Вы также можете использовать некоторые сочетания клавиш, если вы не объединяете команды:

    Или же:

    Вы также можете трубу стандартный вывод в тот же буфер с помощью 2> & 1> / tmp / outputbuffer.

    (Замечания: Я на самом деле не знаю рыба, поэтому я адаптирую концепцию к тому, что могу найти в ее документации. Синтаксис может быть немного неправильным. Также вы можете использовать Mktemp создать уникальный временный файл. Запустите его и запишите имя файла в переменную.)

    Если вам нужно запустить все это в фоновом режиме оболочки, которую вы также используете в интерактивном режиме в то же время, то вам лучше написать сценарий для обработки сокрытия вывода и запустить этот сценарий в фоновом режиме с помощью стандартных методов (рыба). Черт возьми, вы можете поместить что-то вроде следующей функции в ~ / .Config / рыба / config.fish:

    Позвонить с безмолвный somecommand & (где трейлинг & заставляет его работать в фоновом режиме)

    Обратите внимание, что это проглотит исходный код выхода и сбросит оба стандартный вывод а также STDERR в случае отказа. Вы можете настроить его по мере необходимости.

    (1) Нет гарантии, что вывод ошибок не появится стандартный вывод, некоторые программы будут сбрасывать туда весь вывод!

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

    Далее следует ответ Максимиллиана Лаумейстера:

    Утилиты Unix отправляют общие сообщения стандартный вывод, и сообщения об ошибках STDERR, так что если мы хотим видеть только сообщения об ошибках, то этого будет достаточно, чтобы подавить стандартный вывод так что только STDERR получает вывод на консоль.

    Способ сделать это (в обоих удар а также рыба) добавить > / DEV / нуль в команду. Это трубы стандартный вывод в небытие, но STDERR (с вашими сообщениями об ошибках) все еще доходит до консоли.

    Так, например:

    Команда echo 1> / dev / null ничего не печатает, потому что нормальный стандартный вывод вывод подавлен, и ничего не было записано STDERR.

    Команда человек не дотексист> / dev / null печатает сообщение об ошибке, потому что человек пишет сообщение об ошибке STDERR.


    Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.