Как я могу заставить TMUX быть активным, когда я начинаю новый сеанс оболочки?

Вместо того, чтобы набирать tmux каждый раз, , как я могу tmux всегда использоваться для новых окон сеанса?

Итак, если я не открываю окон терминалов, а затем открываю их, как первый сеанс может находиться в tmux?

Кажется, что-то вроде .bashrc?

Ответ 1

warning это может привести к повреждению ваших учетных записей Ubuntu. Используйте с особой осторожностью и убедитесь, что у вас есть вторая учетная запись администратора на компьютере, на которую вы можете войти, если у вас есть те же проблемы, что и я. См. Мой ответ для получения более подробной информации и другого подхода.

Самое простое решение - добавить вызов tmux в конец вашего .bashrc, например.

alias g="grep"
alias ls="ls --color=auto"

# ...other stuff...

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

Обратите внимание, что exec означает, что процесс bash, который запускается при открытии терминала, заменяется на tmux, поэтому Ctrl-B D (т.е. отключить от tmux) фактически закрывает окно, вместо того, чтобы возвращаться к оригинальный bash процесс, который, вероятно, является поведением, которое вы хотите?

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


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

Я использую небольшую исполняемую оболочку script ~/bin/terminal~/bin в $PATH, поэтому она найдена автоматически), которая выглядит примерно так:

#!/bin/sh
exec gnome-terminal -e tmux

(Я не использую gnome-terminal, поэтому вам может понадобиться удалить exec, я не уверен.)

Теперь, когда вы запускаете скролл terminal, у вас есть терминал с tmux. Вы можете добавить это в свои ярлыки меню/рабочего стола/клавиатуры, чтобы заменить терминал по умолчанию.

(Этот подход также позволяет вам более легко настраивать другие вещи о эмуляторе терминала позже, если вы когда-либо захотите.)

Ответ 2

Если вы хотите иметь один сеанс tmux, поставьте следующее в ~/.bashrc для bash или ~/.zshrc для zsh:

tmux attach &> /dev/null

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

Строка tmux attach заключается в том, чтобы убедиться, что есть сеанс, к которому он присоединяется, и если не было сеанса, вы не получите предупреждение о "отсутствии сеанса".

Ответ 3

Мой оригинальный, принятый ответ прекратил работу над моей системой Ubuntu14 после недавнего обновления.

Используя

[ -z "$TMUX" ] && command -v tmux > /dev/null && TERM=xterm-256color && exec tmux

или

[ $TERM != "screen" ] && TERM=xterm-256color && exec tmux

помешало бы мне даже войти в систему. Я смог разрешить это только из-за того, что на компьютере был второй вход администратора.

Исправление для меня в Ubuntu (и в osx тоже) заключалось в том, чтобы изменить мою терминальную программу, чтобы фактически запустить tmux, т.е.

enter image description here

У меня все еще есть

[ `uname -s` != Linux ] && exec tmux

в качестве моей последней строки .bashrc, но теперь он только для моих систем Mac OSX.

Ответ 4

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

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

Обратите внимание, что эта строка должна быть первой строкой в ​​файле bashrc, чтобы убедиться, что она загружена первой. Мы не можем поставить вызов "exec" перед "tmux attach", потому что после того, как exec заменит процесс bash на tmux, соединение будет закрыто, даже если к ним не нужно подключаться. Поэтому нам нужен "выход" для прекращения соединения после отсоединения или выхода из подключенных сеансов. Но ввод "exec" перед командой нового сеанса прекрасен, так как последняя команда должна быть выполнена.

Ответ 5

Добавьте следующую строку кода в конец .bashrc,

[[ $TERM != "screen" ]] && exec tmux

Ответ 6

Однострочный, который также гарантирует правильность установки типа терминала для 256 цветов:

[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux

Ответ 7

Чтобы включить tmux для сеансов login и ssh, вы можете добавить это в конец своего .bashrc:

# enable tmux at login
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then
  exec tmux
fi

Этот script ищет родительский процесс оболочки bash. Если bash был запущен из входа в систему или из ssh, он выполнит tmux. Если вы хотите, чтобы это работало с терминалом GUI, вы можете добавить это и там. Например, если вы хотите запустить tmux автоматически при запуске стандартного Ubuntu gnome-terminal, вы должны использовать это:

PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then
  exec tmux
fi

Я тестировал выше на Live Ubuntu Desktop, после чего мне удалось войти в систему. Это не должно нарушать вход в GUI, если он не запустил команду входа в систему. Я не знаю о GUI Linux, который делает это.

Ответ 8

Я начал с этого https://wiki.archlinux.org/index.php/Tmux#Bash и улучшил его, чтобы восстановить отдельные сеансы и сделать новые, если все сеансы уже были прикреплены

# .bashrc

case $- in
    *i*)
    if command -v tmux>/dev/null; then
        if [[ ! $TERM =~ screen ]] && [[ -z $TMUX ]]; then
          if tmux ls 2> /dev/null | grep -q -v attached; then
            exec tmux attach -t $(tmux ls 2> /dev/null | grep -v attached | head -1 | cut -d : -f 1)
          else
            exec tmux
          fi
        fi
    fi
    ;;
esac

Ответ 10

Я просто сделал это ярлыком на клавиатуре (в Linux Mint не Ubuntu, поэтому я не уверен, что это легко)...


custom shortcut for tmux terminal


Это может быть трудно увидеть, но пользовательский ярлык gnome-terminal --window --maximize -e tmux. Это запустит новое окно gnome-terminal, а затем exec utes tmux для вас.

У меня есть еще один пользовательский ярлык, который запускает "нормальный" gnome-terminal максимизированный (это то же самое без -e tmux).

Я считаю, что это лучший способ, потому что вы можете запускать любой терминал так, как хотите, и это самый настраиваемый способ.

Ответ 11

В xfce4 (я запускаю Fedora 24 XFCE spin, это здорово), я нашел, что самое простое решение - отредактировать ярлыки панели, чтобы они запускались:

xfce4-terminal -e tmux

Эта же команда может использоваться для замены ярлыка приложений клавиатуры.

Я ранее вставлял оператор if в свой .bashrc, но это вызвало ошибку входа в систему (возвратитесь в поле входа в систему, когда был введен правильный пароль).

Команда для команды Thunar Open Terminal Здесь команда немного отличается. Чтобы изменить это goto:

Thunar > Изменить > Настроить пользовательские действия... > Открыть терминал здесь > Изменить и заменить:

exo-open -working-directory% f -launch TerminalEmulator

с: xfce4-terminal -working-directory% f -e tmux