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


14

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

Ответы:


17

К сожалению, предположение, stderrкоторое используется только для вывода ошибок, не всегда верно. Скорее, stderrчасто используется для любого и всех интерактивных выводов и диагностики, т.е. выводов, предназначенных для чтения пользователем в интерактивном приглашении 1 . wgetи ddявляются хорошо известными примерами.

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


Другое соглашение, которое применяется чаще всего, это код выхода : программа возвращает код выхода при выходе. Как правило, 2 , код выхода 0указывает на успех, а любой другой код выхода указывает на ошибку.

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

command 2>/tmp/outputbuffer
if $status
    cat /tmp/outputbuffer
rm /tmp/outputbuffer

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

if command 2>/tmp/outputbuffer
    cat /tmp/outputbuffer
rm /tmp/outputbuffer

Или:

command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;

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

(Примечание: на самом деле я не знаю fish, поэтому я адаптирую концепцию к тому, что могу найти в ее документации. Синтаксис может быть немного неправильным. Кроме того, вы можете использовать mktempдля создания уникального временного файла - запустите его и запишите имя файла в переменной.)

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

function run-silent
    set temp (mktemp)
    if $argv 2>&1 >$temp
        cat $temp
    rm $temp
end

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

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


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

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


Небольшая настройка рыбы, есть специальное место для размещения функций в ~ / .config / fish / functions /
Xster

12

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

Способ сделать это (как в, так bashи в fish) состоит в добавлении >/dev/nullк команде. Этот канал выводит stdout в небытие, но stderr (с вашими сообщениями об ошибках) все еще проходит через консоль

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

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

Команда man doesnotexist >/dev/nullпечатает сообщение об ошибке, потому что manзаписывает свое сообщение об ошибке stderr.


2

Это запустит команду в фоновом режиме и запишет ошибки в файл журнала, игнорируя при этом нормальный вывод

    command > /dev/null 2> /tmp/example_error.log &
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.