Термінал - як відновити сеанс після ненавмисного виходу?


22

Іноді я ненавмисно виходжу з сеансу терміналу (як правило, тому, що я думаю, що я підключений до віддаленої системи, коли мене немає), тому доходжу до цього моменту:

введіть тут опис зображення

Як я можу перезапустити сеанс у цей момент? Я не хочу закривати вікно або вкладку, тому що у мене є маса вкладок, всі налаштовані для мого нормального робочого процесу, тому я просто хочу, щоб сеанс у поточній вкладці повторювався (тобто повертався до баш-підказки).

Єдине рішення, яке я знайшов поки що, - це повністю вийти з терміналу та відкрити його знову, але це далеко не ідеально, оскільки воно, очевидно, перебиває все, що я роблю в інших вікнах / вкладках терміналів.


1
Емулятори терміналів Linux (KDE / Gnome) дозволяють вам повторно замовляти вкладки. Отже, якщо ви запустили нову вкладку, ви можете перемістити її, щоб замінити закриту. Немає цього терміналу ОС X? (Я не мак-людина, я щойно бачив це в "гарячих питаннях мережі".) Я також люблю використовувати екран GNU для мультиплексування багатьох сеансів оболонок, а не вкладки у вікні терміналу. У мене є ще одна вкладка з сеансом на екрані на іншому комп’ютері. Іноді я відкриваю інший термінал, якщо хочу побачити дві речі відразу, але зазвичай мені подобається, щоб мої оболонки були пронумеровані, як це робиться на екрані, а не просто там
Пітер Кордес

1
У будь-якому разі, я б запропонував екран (або tmux, якщо ви ще не знаєте екрану) для збереження декількох оболонок на одному хості на одній вкладці GUI. Ця дворівнева ієрархія вкладок / екранів дозволяє відкрити безліч матеріалів, не втрачаючи при цьому записів. Крім того, як я вже говорив, наявність номерів для різних оболонок дозволяє легко запам'ятати, на яке число потрібно поміняти ( ^t 8наприклад) для заданого контексту, а не візуально рахувати, на яку вкладку натиснути або (або скільки ctrl-pgup, щоб потрапити) .
Пітер Кордес

1
екран і tmux мають налаштовані прокрутки всередині кожного екрана. Я не пам'ятаю, як бачив щось про збереження прокрутки на диску для наполегливості під час перезавантаження! Це акуратно. Три вкладки досить легко, щоб подумки слідкувати. Зазвичай у мене на домашньому робочому столі є щось на зразок 10, оскільки я роблю майже все з командного рядка, а не браузера файлів GUI. (відтворення відео / аудіокниг тощо) У мене, як правило, біля cdвихідного коду є близько трьох оболонок від редагування коду, щоб вони відповідали вашому використанню.
Пітер Кордес

1
У будь-якому випадку, перетягування вкладок повинно полегшити відновлення після випадкового закриття вкладки, оскільки ви можете поставити її туди, куди вона йде.
Пітер Кордес

1
Я не думаю, що багато людей використовують їх локально, для локальних сеансів оболонки всередині однієї вкладки емулятора терміналу. IDK, можливо, це роблять і інші старі шкільні наркомани. Основний випадок використання - це після sshтого, як десь. Я просто звик користуватися екраном і використовувати його як локально, так і на віддалених сесіях. Як я розумію, якщо у вас ще немає screenм’язової пам’яті, вивчіть tmux, тому що екран старий і кремезний. Можливо, я міг би переключитися на нього tmuxта налаштувати його на ті самі ті самі клавіші, що і для мене screen, але екран все ще працює для мене добре.
Пітер Кордес

Відповіді:


26

На даний момент неможливо повернути вкладку. Термінальний сеанс закритий, і він більше не має TTY. Просто не можна посилатися на вкладку, щоб зробити що-небудь розумніше. Я б запропонував додати цю функцію до .bashrc або .profile, щоб у вас не виникло проблем у майбутньому:

exit() {
    read -t5 -n1 -p "Do you really wish to exit? [yN] " should_exit || should_exit=y
    case $should_exit in
        [Yy] ) builtin exit $1 ;;
        * ) printf "\n" ;;
    esac
}

або для тих, хто використовує оболонку Z (додайте її до свого .zshrc):

exit() {
    if read -t5 -q should_exit\?"Do you really wish to exit? [yN] "; then
        builtin exit $1
    fi
}

Це приємний маленький бар'єр між вами та набридливою командою виходу! Господь знає, що я робив те саме багато разів у минулому.


1
Ти отримав це! Тепер, через 5 секунд ( -t 5опція), команда читання вийде з ладу, що запускає команду вихід після неї.
Вільям Т Фроггард

1
Відмінно - дякую - я б хотів, щоб я міг вам дати два голоси! ;-)
Пол Р

1
@PaulR: Вам не потрібно псевдоніму, exitякщо ви використовуєте Bash. Ви можете розмістити свій сценарій ~/.bash_logout.
Призупинено до подальшого повідомлення.

2
@DennisWilliamson: цікава ідея, але я не впевнений, як би ви скасували вихід ізсередини .bash_logout?
Пол Р

3
@PaulR: На жаль. Я не міг це врахувати! Для повноти також слід logoutвстановити псевдонім і встановити IGNOREEOFбільше 1 (або відновлювати ^ D).
Призупинено до подальшого повідомлення.

5

Сценарій Вільяма Т Фроггарда не робив того, що мені потрібно, тому що, як правило, єдиний спосіб потрапити в цю ситуацію - через ^ D ( ctrl+ D), і переосмислення exitнічого не зробило для цієї ситуації. Для мене пропозиція Денніса Вільямсона встановити IGNOREEOFбуло достатньо. Я щойно додав:

# Do not exit on a single ^D, require 2 in a row
IGNOREEOF=1

до мого ~/.bashrcфайлу, і тепер (якщо я в оболонці верхнього рівня і вийшов би з терміналу), перший ^ D генерує відповідь:

Use "logout" to leave the shell.

Якщо я знову введу ^ D, оболонка виходить, тому вихід, коли я хочу, все ще легко, але тепер один ^ D надішле мені попередження. (Якщо потрібно, ви можете встановити IGNOREEOFбільшу кількість, щоб вимагати додаткових послідовних ^ D.)

Також корисно, якщо я перебуваю в підколонці, перший ^ D генерує відповідь:

Use "exit" to leave the shell.

Знову-таки, додатковий ^ D виведе мене, і тепер я можу сказати різницю між тим, як вийти з під-оболонки і вийти з оболонки верхнього рівня.

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