Как условно перенаправить вывод команды в/dev/null?

У меня есть script. Я хотел бы дать этому script тихий режим и подробный режим.

Это эквивалент:

if $verbose
then
  redirect="> /dev/null"
fi

echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated.

Мне бы очень хотелось, чтобы это было лучше, чем писать if-elses для каждого затронутого заявления.

eval может работать, но имеет очевидные побочные эффекты для других переменных.

Ответ 1

Вы можете написать функцию обертки:

redirect_cmd() {
    # write your test however you want; this just tests if SILENT is non-empty
    if [ -n "$SILENT" ]; then
        "[email protected]" > /dev/null
    else
        "[email protected]"
    fi
}

Затем вы можете использовать его для запуска любой команды с перенаправлением:

redirect_cmd echo "unsilenced echo"
redirect_cmd ls -d foo*

SILENCE=1
redirect_cmd echo "nothing will be printed"
redirect_cmd touch but_the_command_is_still_run

(Если все, что вам нужно сделать, это эхо с этим, вы можете, конечно, сделать функцию проще, просто повторять первый аргумент вместо того, чтобы запускать их как команду)

Ответ 2

Получил идею из другого вопроса:

#!/bin/sh

if [ $SILENT ]; then
    exec &>/dev/null
fi

echo "Silence here."

Ответ 3

Не идеально, но как насчет перенаправления на "/dev/null" или "/dev/tty", а затем выполнение

{
   echo "verbose"
    ....
} > $redirect

Ответ 4

Подумайте, стоит ли устанавливать set -x для подробного ведения журнала в stderr в подробном режиме. Если это так, то вывод с помощью verbose-only может быть достигнут с помощью no-op :, как это.

while getopts "v" o
do case "$o" in
   v) set -x;;
   esac
done

echo "This will always be output"           # goes to stdout
: this will only be output in verbose mode  # goes to stderr

: оценивает его аргументы, но ничего не делает с ними. set -x покажет, что было оценено на stderr, поскольку каждый оператор выполнен.

Он также позволяет вам разделить подробные и стандартные журналы по потоку.

Не может быть того, что вам нужно здесь, но это может быть удобный трюк.