условное перенаправление в bash - PullRequest
21 голосов
/ 06 января 2012

У меня есть скрипт bash, который я хочу быть тихим при запуске без прикрепленного tty (как из cron). Теперь я искал способ условно перенаправить вывод в / dev / null в одну строку. Это пример того, что я имел в виду, но у меня будет еще много команд, которые выводят в сценарии

#!/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.

Ответы [ 3 ]

25 голосов
/ 06 января 2012

Для 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.
5 голосов
/ 06 января 2012

Я нашел другое решение, но чувствую, что оно неуклюже, по сравнению с ответом Паксдиабло :

if tty -s; then 
  REDIRECT=/dev/tty
else 
  REDIRECT=/dev/null
fi
echo "Normal output" &> $REDIRECT
2 голосов
/ 19 сентября 2017

Вы можете использовать функцию:

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
...