Перенаправить вывод для команд на основе состояния переменной - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть много команд в скрипте bash, в которых >/dev/null 2>&1 используется для перенаправления stdout и stderr в /dev/null.

Допустим, у меня есть переменная с именем echoOn, которая может может быть 0 или 1.

Если echoOn равно 0, тогда я буду sh, чтобы сохранить перенаправления команд в сценарии. Если оно равно 1, то я не хочу, чтобы перенаправление было на месте, поэтому команды могут выводить.

Я не могу sh подавить вывод всех команд, а только указать c те, что в скрипте.

Есть ли для меня более абстрактный способ сделать это без добавления вручную операторов if к каждой рассматриваемой команде?

Я открыт для использования функции, в которой я передать команду и ее аргументы и заменить каждую команду вызовом вышеупомянутой функции и команды, которая должна быть выполнена.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

Я не уверен, правильно ли я понимаю ваши требования, но как насчет:

# put the lines below at the beginning of the script
if (( echoOn == 0 )); then
    exec 3>/dev/null 2>&3
else
    exec 3>&1
fi

# then execute your commands
echo foo >&3    # a command which wants to switch the redirection
echo warn >&2   # simulates an error
echo bar        # a command which does not need the switch

Если для echoOn установлено значение 0, на терминале отображается только bar .

Проблема в том, что вам нужно изменить код, заменив все >/dev/null 2>&1 выражения на >&3.

[Обновить]

In Чтобы управлять как stdout, так и stderr по команде Speci c, попробуйте следующее:

echoOn=0        # set to "1" to ebable stdout/stderr else set to "0"
if (( echoOn == 0 )); then
    exec 3>/dev/null
    exec 4>/dev/null
else
    exec 3>&1
    exec 4>&2
fi

echo foo 1>&3 2>&4          # a command which wants to switch the redirection
(echo warn >&2) 1>&3 2>&4   # simulates an error
echo bar                    # a command which does not need the switch
(echo error >&2)            # simulates anerror

Пожалуйста, поставьте 1>&3 2>&4 для команд, для которых вы хотите управлять выводом

1 голос
/ 07 февраля 2020

Попробуйте это:

if [ $# -ge 1 -a $1 -eq 0 ]; then
    exec 3>/dev/null 1>&3 2>&3
else
    exec 3>&1
fi

foo="hello"
warn="world"
bar="stackoverflow"


# then execute your commands
echo $foo >&3    # a command which wants to switch the redirection
echo $warn >&2   # simulates an error
echo $bar        # a command which does not need the switch

У меня есть много команд в скрипте bash, для которых> / dev / null 2> & 1 используется для перенаправления stdout и stderr в / dev / null.

В принятом ответе не используется $ для получения значения вашей переменной. Я думаю, что вы можете получить ошибки, если попытаетесь запустить скрипт. И вам нужно перенаправить как stdout, так и stderr. Так что мой скрипт перенаправляет оба к /dev/null, если вы передаете в скрипт аргумент 0, в противном случае он не перенаправляет.

Нет вывода, если вы запускаете ./example.sh 0

Вывод ./example 1

hello
world
stackoverflow
...