Как я могу условно перенаправить вывод команды в / dev / null? - PullRequest
14 голосов
/ 26 марта 2010

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

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

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 может работать, но имеет очевидные побочные эффекты для других переменных.

Ответы [ 4 ]

10 голосов
/ 26 марта 2010

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

redirect_cmd() {
    # write your test however you want; this just tests if SILENT is non-empty
    if [ -n "$SILENT" ]; then
        "$@" > /dev/null
    else
        "$@"
    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

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

6 голосов
/ 26 марта 2010

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

#!/bin/sh

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

echo "Silence here."
3 голосов
/ 26 марта 2010

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

{
   echo "verbose"
    ....
} > $redirect
0 голосов
/ 30 ноября 2017

Подумайте, стоит ли устанавливать set -x для подробного входа в stderr в подробном режиме. Если это так, то подробный вывод может быть достигнут с помощью 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 при выполнении каждого оператора.

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

Может быть, это не то, что вам нужно, но это может быть удобным трюком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...