Відповіді:
На жаль, припущення, яке 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 На жаль, це все ще не завжди так - код виходу повністю контролюється програмою, а деякі вказують на деякі умови успіху з ненульовими виходами. Ще раз перевірте інструкцію.
Утиліти Unix надсилають загальні повідомлення stdout
та повідомлення про помилки stderr
, тому, якщо ми хочемо бачити лише повідомлення про помилки, то їх буде достатньо для придушення, stdout
щоб отримати лише stderr
вихід на консоль.
Спосіб цього (і в обох, bash
і в fish
) - додавання >/dev/null
до команди. Ця труба виходить у небуття, але stderr (із повідомленнями про ваші помилки) все-таки потрапляє на консоль.
Так, наприклад:
Команда echo 1 >/dev/null
нічого не друкує, тому що нормальний stdout
вихід придушений, і в stderr нічого не було записано.
Команда man doesnotexist >/dev/null
друкує повідомлення про помилку, оскільки man
записує своє повідомлення про помилку stderr
.