Як запустити команду у фоновому режимі без виводу, якщо помилка не відбулася


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 / function /
Xster

12

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

Спосіб цього (і в обох, bashі в fish) - додавання >/dev/nullдо команди. Ця труба виходить у небуття, але 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.