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

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

exec &>filename 

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

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

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

  • Что случилось с этим использованием перенаправления?
  • Почему некоторые linux-инструменты записывают в STDERR вместо STDOUT по умолчанию?
  • Почему перенаправление STDERR на / dev / null выполняется таким образом?
  • Перенаправить вывод программы в файл не удается
  • Как отправить надстройку stdout в multilog и второй процесс
  • io перенаправление на «крест» 2 программы
  • перенаправить в тот же файл, что и исходный файл, обработанный командой
  • Захват вывода без перенаправления и оставьте его на терминале тоже
  • 2 Solutions collect form web for “Восстановление вывода на терминал после выдачи «exec &> filename»”

    После запуска 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” 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.