Відновлення виводу в термінал після видачі "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.