Условное перенаправление в bash
У меня есть bash script, что я хочу быть спокойным, когда вы запускаете без привязки tty (например, cron).
Теперь я искал способ условно перенаправить вывод в /dev/null в одной строке.
Это пример того, что я имел в виду, но у меня будет еще много команд, которые выводят в script
#!/bin/bash
# conditional-redirect.sh
if tty -s; then
REDIRECT=
else
REDIRECT=">& /dev/null"
fi
echo "is this visible?" $REDIRECT
К сожалению, это не работает:
$ ./conditional-redirect.sh
is this visible?
$ echo "" | ./conditional-redirect.sh
is this visible? >& /dev/null
то, что я не хочу делать, - это дублировать все команды в варианте с перенаправлением или без-перенаправления:
if tty -s; then
echo "is this visible?"
else
echo "is this visible?" >& /dev/null
fi
EDIT:
Было бы здорово, если бы решение предоставило мне способ вывода чего-либо в "тихом" режиме, например. когда что-то действительно не так, я мог бы получить уведомление от cron.
Ответы
Ответ 1
Для bash
вы можете использовать строку:
exec &>/dev/null
Это будет направлять все stdout
и stderr
в /dev/null
с этой точки. Он использует версию без аргументов exec
.
Обычно что-то вроде exec xyzzy
заменяет программу в текущем процессе новой программой, но вы можете использовать эту версию без аргументов, чтобы просто изменять перенаправления при сохранении текущей программы.
Итак, в вашем конкретном случае вы можете использовать что-то вроде:
tty -s
if [[ $? -eq 1 ]] ; then
exec &>/dev/null
fi
Если вы хотите, чтобы большая часть вывода была отброшена, но все же хотите вывести некоторые вещи, вы можете создать новый дескриптор файла для этого. Что-то вроде:
tty -s
if [[ $? -eq 1 ]] ; then
exec 3>&1 &>/dev/null
else
exec 3>&1
fi
echo Normal # won't see this.
echo Failure >&3 # will see this.
Ответ 2
Я нашел другое решение, но я чувствую, что он неуклюж, по сравнению с paxdiablo answer:
if tty -s; then
REDIRECT=/dev/tty
else
REDIRECT=/dev/null
fi
echo "Normal output" &> $REDIRECT
Ответ 3
Вы можете использовать функцию:
function the_code {
echo "is this visible?"
# as many code lines as you want
}
if tty -s; then # or other condition
the_code
else
the_code >& /dev/null
fi