Если вы занятой человек, то последнее, что вам нужно, это возиться с огромным количеством «бесполезных» уведомлений, так как же вы успокаиваетесь? В сегодняшней публикации SuperUser Q & A есть несколько отличных ответов, которые помогут читателю снизить объемы вывода.
Сегодняшняя сессия вопросов и ответов приходит к нам благодаря SuperUser – подразделению Stack Exchange, группы веб-сайтов вопросов и ответов, управляемой сообществом.
Вопрос
Считыватель SuperUser Xster хочет знать, как выполнить команду в фоновом режиме без вывода, если только нет ошибки:
Как вы подавляете вывод команды, но показываете ли это, если выход команды кодирует ошибку?
Как вы получаете команду для запуска в фоновом режиме без вывода, если нет ошибки?
Ответ
Авторы SuperUser Боб и Максимилиан Лаумейстер ответят за нас. Сначала Боб:
К сожалению, предположение, что stderr используется только для вывода ошибок, не всегда верно. Скорее, stderr часто используется для любого и всех интерактивных выводов и диагностики (т. Е. Выводов, предназначенных для чтения пользователем в интерактивном режиме). (1) wget и dd являются хорошо известными примерами.
Некоторые команды предоставляют флаг (т.е. -quiet или -silent ) для подавления вывода без ошибок. Прочтите их справочные страницы, чтобы увидеть, существует ли он
Другое соглашение, которое применяется чаще всего, это код выхода , программа возвращает код выхода при выходе. Обычно (2) , код выхода 0 указывает на успех, а любой другой код выхода указывает на ошибку.
С помощью bash вы можете получить код завершения последней команды из переменной $? . В fish используйте переменную $ status . Вы можете передать stderr во временный файл и распечатать его только в случае возникновения ошибки. Например ( fish ):
Вы также можете использовать некоторые сочетания клавиш, если вы не используете команды:
Или же:
Вы также можете передать stdout в тот же буфер, используя 2> & 1>/tmp/outputbuffer .
( Примечание: на самом деле я не знаю fish , поэтому я адаптирую концепцию к тому, что могу найти в ее документации. Синтаксис может быть немного неправильным. Кроме того, вы можете используйте mktemp для создания уникального временного файла. Запустите его и запишите имя файла в переменной.)
Если вам нужно запустить все это в фоновом режиме оболочки, которую вы также используете в интерактивном режиме в то же время, то вам лучше написать сценарий для обработки сокрытия вывода и запустить этот сценарий в фоновом режиме с помощью стандартных методов ( рыба ). Черт возьми, вы можете поместить что-то вроде следующей функции в ~/.config/fish/config.fish :
Вызовите с помощью run-silent somecommand & (где завершающий & заставляет его работать в фоновом режиме)
Обратите внимание, что это поглотит исходный код завершения и в случае сбоя сбросит как stdout , так и stderr . Вы можете настроить его по мере необходимости.
(1) Нет гарантии, что вывод ошибок не будет отображаться на stdout , некоторые программы будут выводить весь вывод там!
(2) К сожалению, это не всегда так. Код выхода полностью контролируется программой, и некоторые из них будут указывать некоторые условия успеха с ненулевыми выходами. Снова, проверьте руководство.
Далее следует ответ Максимиллиана Лаумейстера:
Утилиты Unix отправляют общие сообщения stdout , а сообщения об ошибках – stderr , поэтому, если мы хотим видеть только сообщения об ошибках, тогда будет достаточно подавить stdout так, чтобы только stderr получал вывод на консоль.
Способ сделать это (как в bash , так и в fish ) – добавить к команде >/dev/null . Это перенаправляет stdout в небытие, но stderr (с вашими сообщениями об ошибках) все еще проходит через консоль.
Так, например:
Команда echo 1>/dev/null ничего не печатает, поскольку обычный вывод stdout подавлен, и ничего не было записано в stderr .
Команда man doesnotexist>/dev/null печатает сообщение об ошибке, поскольку man записывает свое сообщение об ошибке в stderr .
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других опытных пользователей Stack Exchange? Ознакомьтесь с полной веткой обсуждения здесь.