Как условно перенаправить вывод команды в/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, поскольку каждый оператор выполнен.
Он также позволяет вам разделить подробные и стандартные журналы по потоку.
Не может быть того, что вам нужно здесь, но это может быть удобный трюк.