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


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

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

кажется .bashrc подобное возможно?

11 53

11 ответов:

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

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

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

# ...other stuff...

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

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

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


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

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

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

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

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

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

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

tmux attach &> /dev/null

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

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

мой оригинальный, принятый ответ, перестал работать на моей системе 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 сейчас.

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

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

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

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

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

Я начал с этого 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

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

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

этот сценарий выглядит для родительского процесса из командной оболочкой 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

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

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

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

Как насчет добавления

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

в свой .bashrc следующее. Он также работает для zsh.

взято из https://wiki.archlinux.org/index.php/Tmux#Start_tmux_with_default_session_layout

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


custom shortcut for tmux terminal


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

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

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

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

xfce4-terminal-e tmux

эта же команда может быть использована для замены сочетания клавиш приложения.

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

команда для Thunar по Открыть терминал здесь команда отличается незначительно. Чтобы изменить это Гото:

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

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

с: xfce4-терминал --рабочий каталог %f-e tmux