Как выйти из tmux, не выходя из терминала

Я использую tmux на bash и позволяю ему автоматически запускаться с .bashrc. Иногда я хочу, чтобы он был отключен, и я должен отредактировать свой .bashrc, чтобы сделать это. Редактировать файл каждый раз, когда я отключаю tmux, довольно проблематично, и я думаю, что самый простой способ сделать то же самое — выйти из tmux, не выходя из терминала. Я могу это сделать?

Когда я набираю exit, bash и терминал закрываются. Я попробовал exec bash , но он просто перезапустил bash внутри tmux.

Я запускаю tmux из приведенного ниже кода в соответствии с https://wiki.archlinux.org/index.php/tmux#Bash.

if [[ $DISPLAY ]]; then
        # If not running interactively, do not do anything
        [[ $- != *i* ]] && return
        [[ -z "$TMUX" ]] && exec tmux
fi

Если я просто запущу tmux в приведенном выше коде вместо exec tmux, я смогу достичь своей цели. Но мне это не нравится, потому что я не понимаю, почему в коде используется exec tmux, а не tmux, и не хочу его опрометчиво менять, а когда я запускаю tmux, мне нужно набрать exit или C-d дважды, чтобы выйти из терминала.


person A01    schedule 31.08.2019    source источник
comment
Совершенно безопасно просто удалить exec; его использование приводит к тому, что tmux заменяет источник оболочки .bashrc, и это именно то, что вы не хотите делать.   -  person chepner    schedule 04.09.2019
comment
@chepner Спасибо, я удалю exec, и это решит мою проблему.   -  person A01    schedule 04.09.2019


Ответы (1)


(Примечание: этот вопрос действительно должен быть на unix.stackexchange.com). Одним из простых решений является замена строки

[[ -z "$TMUX" ]] && exec tmux

с участием

[[ -z "$TMUX" ]] && { tmux; [ ! -f ~/dontdie ] && exit || rm ~/dontdie; }

Это запускает tmux, как и раньше, но когда он завершает работу, он проверяет наличие файла ~/dontdie. Если файл не существует, выполняется && exit, и терминал закрывается, как и раньше. Однако если вы создадите файл до выхода из tmux, то вы выполните часть || rm ..., которая удаляет файл, и продолжите работу с остальной частью файла .bashrc, оставив вас в оболочке bash.

Итак, чтобы остаться в терминале, из окна tmux вы вводите команды:

touch ~/dontdie; exit

вместо просто exit, и вы выйдете из tmux и продолжите работу в bash. Чтобы упростить задачу, вы можете добавить привязку в ~/.tmux.conf к ключу, например X:

bind-key X send-keys 'touch ~/dontdie; exit' Enter

Затем вы просто вводите символ префикса, Control-B по умолчанию, затем X, чтобы создать файл и выйти из tmux.

person meuh    schedule 01.09.2019
comment
За исключением использования tmux, это работает отлично. На самом деле, каковы плюсы и минусы exec tmux и tmux? - person A01; 01.09.2019
comment
Когда вы exec tmux заменяете процесс оболочки на tmux. Когда tmux завершает работу, вы не можете вернуться в оболочку и должны вернуться к тому, что запустило оболочку, если она все еще работает. Вы не продолжаете строки в .bashrc, которые следуют за exec. Без exec, когда tmux завершает работу, вы продолжаете работу с этими строками, и когда оболочка доходит до конца файла .bashrc, она продолжается в вашем терминале. - person meuh; 01.09.2019
comment
Есть ли недостатки в использовании tmux вместо exec tmux и наоборот? Мне неудобно использовать tmux, потому что я не понимаю, почему в ссылке используется exec tmux. Нет ли причин выбрать exec tmux, чем tmux? - person A01; 01.09.2019
comment
Если это поможет понять, вы можете заменить exec tmux на tmux; exit, что даст тот же эффект. Ценность использования exec в этом случае заключается в том, что оболочка не тратит ресурсы впустую, ожидая завершения tmux, когда все, что она собирается сделать, это выйти из себя. - person meuh; 01.09.2019