Подтвердить что ты не робот

Условное перенаправление в 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.

4b9b3361

Ответ 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