Відновлення виводу в термінал після видачі "exec &> filename"


15

Я намагаюся виконати наступне:

exec &>filename

Після цього я не в змозі побачити нічого, включаючи те, що я набрав, добре.

Я несамовито намагаюся, exec 1>&1і exec 2>&2, але нічого не відбувається.

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


1
Хм ... чому ти перенаправляєш stderr / stdout своєї інтерактивної оболонки? Ця execконструкція зазвичай використовується в сценаріях, які працюють в підзарядці, щоб перенаправити їх вихід, наприклад, на файл. Я не бачу в цьому використання інтерактивного сеансу.
Мартін фон Віттіч

3
@MartinvonWittich Я згоден із заявою про exec. Я згоден. Я просто дитина, яка грає навколо :)
user917279

Відповіді:


23

Після запуску exec &>filenameпереходять до стандартного виводу та стандартної помилки оболонки filename. Стандартний вхід - це дескриптор файлу 0 за визначенням, а стандартний вихід - fd 1, а стандартна помилка - fd 2.

Дескриптор файлу не є ні перенаправленим, ні не перенаправленим: він завжди кудись іде (якщо припустимо, що цей дескриптор відкритий). Перенаправити дескриптор файлу означає змінити, куди він йде. Коли ви бігли exec &>filename, stdout та stderr раніше були підключені до терміналу і стали підключені до нього filename.

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

exec &>/dev/tty

1
як @ Джосеф Р. відповів, що $ (tty) показує мені / dev / pty0, але ваша команда теж працює, яка з них є більш портативною для всіх ароматів Unix? дякую йо ти за більш чітку відповідь.
user917279

2
@ user917279 Вони однаково портативні в сенсі роботи над різними смаками Unix. /dev/ttyпрацює в тих випадках, коли $(tty)це не так: /dev/ttyпрацює до тих пір, поки у процесу є контрольний термінал (що найкраще, на що ви можете сподіватися, оскільки все-таки має бути щось, що з'єднує процес з терміналом), тоді як $(tty)вимагає, щоб термінал все-таки був відкритий на стандартному вході.
Жил "ТАК - перестань бути злим"

Чому exec &>/dev/ttyі ні exec >/dev/tty?
Ентоні Рутлідж

@AnthonyRutledge Тому що питання - що робити після exec &>filename, а не що робити після exec >filename.
Жил "ТАК - перестань бути злим"

11

Ти хочеш

exec &>$(tty)

Що ви робите у своєму запитанні - це реплікація в stdout та stderr оригінальної stdout та stderr, які вже були перенаправлені до файлу.

Як пояснюється у відповіді Жилла, ttyповернеться термінальний пристрій поточного терміналу. Ось де три стандартних дескриптора файлів надходять / збираються за замовчуванням у оболонці для входу. Отже, наведене вище твердження використовує ttyдля перенаправлення stdout та stderr назад до термінального пристрою, як це було раніше.

Якщо вас турбує портативність (згідно з вашим коментарем до відповіді Гілла), обидва способи ( утиліта tty та /dev/ttyфайл ) відповідають стандарту POSIX.

Скопійовано дослівно з коментаря Жиля:

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

це працює! Дякую. echo $ (tty) дає / dev / pty0 (у cygwin), як це пов'язано зі stdin, stdout та що відбувається з вищезазначеним твердженням? будь ласка, дайте мені знати, чи потрібно мені ставити це як окреме питання.
user917279

@ user917279 Відповідь оновлено.
Джозеф Р.

Дякую, Йосифе. Я розмістив це питання, перш ніж подивитись відповідь Джайлса. Велике спасибі. Будь ласка, дозвольте мені позначити відповідь Джайлса як прийняту, бо це зробило навіть тупі розуми, як моя, щоб правильно зрозуміти.
user917279

2
Є перевага в тому, що /dev/ttyвін працює навіть після exec <somefile, тоді як $(tty)скаржиться "не на десятку".
Жил "ТАК - перестань бути злим"

@Gilles Дякую за характерно прояснюючий коментар :)
Джозеф Р.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.