У меня есть скрипт Bash:
#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0
Также у меня есть пользовательское приложение, которое запускает этот скрипт. Приложение захватывает и stdout, и stderr. Stdout пуст, а stderr содержит предоставленный текст. Пока все хорошо. Но когда я запускаю скрипт из консоли (физического терминала):
./my_script.sh
Я ожидаю, что он ничего не выведет на дисплей, но он выводит. Я пробовал разные комбинации перенаправления, например, >&2
, >/dev/stderr
, и т. д., но результаты те же. Я также пробовал перенаправить stdout в null 1>&2 >/dev/null
, но, очевидно, он также отправляет мой текст в null.
Где это настраивается? Как сделать так, чтобы мой терминал не отображал stderr?
решение1
Чтобы остановить отправку скриптом стандартного потока ошибок на терминал, необходимо перенаправить его в /dev/null
файл.
Это можно сделать, вызвав скрипт со стандартным потоком ошибок, перенаправленным в командной строке, или позволив самому скрипту перенаправить свой поток ошибок.
Чтобы перенаправить поток ошибок /dev/null
в командную строку, вызовите скрипт с помощью
./my_script 2>/dev/null
Если вы хотите, чтобы скрипт автоматически отбрасывал стандартный поток ошибок, перенаправьте поток /dev/null
внутрь скрипта:
#!/bin/bash
# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null
echo 'This should not be visible.' >&2
echo 'This should be visible.'
Измените /dev/null
путь к файлу, чтобы передать диагностические данные в этот файл.
Стандартный поток вывода не затрагивается перенаправлением стандартного потока ошибок в /dev/null
файл или обратно.
Обратите внимание, что скрипт обычно не следует завершать с помощью exit 0
.
решение2
Чтобы заставить этот конкретный скрипт отменить свой стандартный вывод:
Дан сценарий:
date
date -r /var/empty/foo
отредактируйте его, чтобы он сталгрупповая командаГруппировка команд таким образом позволяет обрабатывать стандартный вывод и стандартные потоки ошибок объединенных команд (перенаправлять, передавать по конвейеру, отбрасывать и т. д.) так, как если бы группа логически представляла собой одну команду.
Например:
{
date
date -r /var/empty/foo
} > /dev/null
отбрасывает стандартный вывод, но не изменяет маршрутизацию стандартного потока ошибок.
Следующий скрипт:
{
date
date -r /var/empty/foo
} > /dev/null 2>&1
перенаправит свой стандартный вывод в /dev/null, а затем перенаправит свою стандартную ошибку в свой стандартный вывод, таким образом отбрасывая и stderr, и stdout. Этот конкретный синтаксис эквивалентен:
{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null