Есть ли команда, чтобы отменить это? (Без перезапуска 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
Не совсем, поскольку это потребует изменения состояния запущенного процесса. Даже если предположить, что вы могли бы, независимо от того, что вы написали до сброса стандартного вывода, действительно, полностью исчезли, поскольку он был отправлен в бит-ведро.