Ответы:
К сожалению, предположение, 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
к команде. Этот канал выводит stdout в небытие, но stderr (с вашими сообщениями об ошибках) все еще проходит через консоль
Так, например:
Команда echo 1 >/dev/null
ничего не печатает, потому что нормальный stdout
вывод подавлен, и ничего не было записано в stderr.
Команда man doesnotexist >/dev/null
печатает сообщение об ошибке, потому что man
записывает свое сообщение об ошибке stderr
.