Почему скрипт Bash все равно выводит данные на stdout, даже если я перенаправляю его на stderr?

Почему скрипт Bash все равно выводит данные на stdout, даже если я перенаправляю его на stderr?

У меня есть скрипт 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

Связанный контент