Intereting Posts
Где измеряется время Unix / официальное время? Создайте две последовательности чисел, разделенные символом "|" Ошибка монтирования NFS Как я могу проверить, запущен ли мой cronjob на моем сервере через PHP? Остановить KDE от неаксимизации окна при перетаскивании движения, начиная с границы окна Вывод консоли из существующих процессов (процессов) в файл Почему моя системная архитектура i386 на 64-битном процессоре? Создание CodeBlocks работает с Terminator? тайм-аут не работает с оболочкой accumulo в сценарии bash Могу ли я сделать резервную копию 1 ТБ диска на 750-Гбайт? Какие оболочки имеют функции, где «local» не изменяет экспортированные переменные для дочерних процессов? Не удалось синхронизировать клиент NTP v4 с сервером Windows AD Защита сервера локальной сети с помощью OpenVPN? контролировать файловые системы linux с помощью df Восстановление данных в поврежденном каталоге в файловой системе ext3

Восстановление вывода на терминал после выдачи «exec &> filename»

Я пытаюсь выполнить следующее:

exec &>filename 

После этого я не вижу ничего, кроме того, что я набрал, хорошо.

Я безумно стараюсь, exec 1>&1 и exec 2>&2 , но ничего не происходит.

Теперь, не убивая оболочку, как мне вернуть выход, перенаправленный на stdout и ошибку, перенаправленную на stderr соответственно? Являются ли дескрипторы файлов единственным способом ссылки на стандартный [in | out] put и stderr?

После запуска exec &>filename стандартный вывод и стандартная ошибка оболочки переходят к filename . Стандартный ввод – это дескриптор файла по определению, а стандартный вывод – fd 1, а стандартная ошибка – fd 2.

Дескриптор файла не перенаправлен или не перенаправлен: он всегда идет куда-то (при условии, что процесс имеет этот дескриптор открытым). Чтобы перенаправить файловый дескриптор, нужно изменить его. Когда вы запускали exec &>filename , stdout и stderr ранее были подключены к терминалу и подключились к filename .

Всегда есть способ обратиться к текущему терминалу: /dev/tty . Когда процесс открывает этот файл, он всегда означает управляющий терминал процесса, в зависимости от того, что это такое. Поэтому, если вы хотите вернуть исходный stdout и stderr этой оболочки, вы можете сделать это, потому что файл, к которому они были подключены, все еще существует.

 exec &>/dev/tty 

Вы хотите

 exec &>$(tty) 

То, что вы делаете в своем вопросе, – это реплицирование в stdout и stderr исходных stdout и stderr, которые уже были перенаправлены в файл.

Как объясняет tty , tty вернет терминальное устройство текущего терминала. Здесь три стандартных дескриптора файла поступают с / по умолчанию в оболочку входа. Таким образом, в приведенном выше заявлении используется tty для перенаправления stdout и stderr на терминальное устройство, как и раньше.

Если вы обеспокоены переносимостью (в соответствии с вашим ответом на ответ Жиля), оба метода ( утилита /dev/tty файл /dev/tty ) находятся в стандарте POSIX.

Скопировано verbatim из комментария Gilles:

 There's an advantage to /dev/tty: it works even after exec <somefile, whereas $(tty) would complain “not a tty”