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

22

Иногда я непреднамеренно выхожу из сеанса терминала (обычно потому, что мне кажется, что я подключен к удаленной системе, а я нет), поэтому я подхожу к следующему:

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

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

Единственное решение, которое я нашел до сих пор, - это полностью закрыть Терминал и снова открыть его, но это далеко от идеала, поскольку оно явно прерывает все остальное, что я делаю в других окнах / вкладках Терминала.

Пол Р
источник
1
Эмуляторы терминала Linux (KDE / Gnome) позволяют переупорядочивать вкладки. Поэтому, если вы открываете новую вкладку, вы можете переместить ее, чтобы заменить ту, которую вы закрыли. Разве в терминале OS X этого нет? (Я не макинтош, я просто видел это в «горячих сетевых вопросах».) Мне также нравится использовать экран GNU для мультиплексирования многих сеансов оболочки, а не вкладок в окне терминала. У меня есть еще одна вкладка с сеансом экрана на другом компьютере. Иногда я открываю другой терминал, если хочу увидеть две вещи одновременно, но обычно мне нравится, когда мои оболочки нумеруются, как на экране, а не просто там
Питер Кордес
1
В любом случае, я бы предложил экран (или tmux, если вы еще не знаете экран) для хранения нескольких оболочек на одном хосте в одной вкладке GUI. Эта двухуровневая иерархия вкладок / экранных окон позволяет открывать множество вещей, не теряя при этом, что находится. Кроме того, как я уже сказал, наличие номеров для различных оболочек позволяет легко запомнить, какой номер нужно поменять ( ^t 8например) для данного контекста, вместо того, чтобы визуально подсчитывать, какую вкладку нажимать или (или сколько нажатий ctrl-pgup) ,
Питер Кордес
1
screen и tmux имеют настраиваемый прокрутку внутри каждого экранного окна. Я не помню ничего о сохранении прокрутки на диске для сохранения при перезагрузке! Это аккуратно. Три вкладки достаточно легко отслеживать мысленно. У меня обычно есть что-то вроде 10 на моем домашнем рабочем столе, так как я делаю почти все из командной строки, а не через браузер файлов GUI. (воспроизведение видео / аудиокниг и т. д.) cdКогда я работаю над кодом, у меня обычно около трех оболочек, добавляемых к исходному коду, что соответствует вашему использованию.
Питер Кордес
1
В любом случае, перетаскивание вкладок должно облегчить восстановление после случайного закрытия вкладки, поскольку вы можете вернуть ее туда, куда она идет.
Питер Кордес
1
Я не думаю, что многие люди используют их локально, для локальных сессий оболочки внутри одной вкладки эмулятора терминала. ИДК, возможно, это делают и другие любители старой школы из командной строки. Основной вариант использования - после чего- 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 Shell (добавьте его в свой .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 вытащит меня, и теперь я могу определить разницу между выходом из под-оболочки и выходом из оболочки верхнего уровня.

Old Pro
источник