Как отменить exec>/dev/null в bash?

Я использовал

exec > /dev/null

для подавления вывода.

Есть ли команда, чтобы отменить это? (Без перезапуска script.)

Ответ 1

Чтобы сделать это правильно, вам нужно скопировать исходный FD 1 где-то еще, прежде чем переписывать его в /dev/null. В этом случае я сохраняю резервную копию на FD 5:

exec 5>&1 >/dev/null
...
exec 1>&5

Другой вариант - перенаправление stdout внутри блока, а не использование exec:

{
    ...
} >/dev/null

Ответ 2

Если вы просто хотите получить вывод снова в командной строке, вы можете сделать это:

exec >/dev/tty

Если вы создаете script, и хотите, чтобы выводился вывод определенной группы перенаправленных команд, поместите эти команды в фигурные скобки:

{
   command
   command
} >/dev/null

Ответ 3

Для восстановления stdout я использую

unset &1

Ответ 4

Сохраните исходные выходные цели заранее.

# $$ = the PID of the running script instance
STDOUT='readlink -f /proc/$$/fd/1'
STDERR='readlink -f /proc/$$/fd/2'

И восстановите их снова, используя exec.

exec 1>$STDOUT 2>$STDERR

Если вы используете /dev/tty для восстановления, в отличие от этого, вы не сможете выполнять перенаправления на уровне вызовов, например, bash script.sh &>/dev/null не будет работать.

Ответ 5

Не совсем, поскольку это потребует изменения состояния запущенного процесса. Даже если предположить, что вы могли бы, независимо от того, что вы написали до сброса стандартного вывода, действительно, полностью исчезли, поскольку он был отправлен в бит-ведро.