Как настроить оболочку по умолчанию для запуска tmux

79

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

Майкл Даррант
источник

Ответы:

46

Это похоже на работу ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Просто добавьте следующую строку кода bash в ваш .bashrc перед вашими псевдонимами; код для других оболочек очень похож:

[[ $TERM != "screen" ]] && exec tmux
StarNamer
источник
2
Для меня это также требуется, [[ $- != *i* ]] && returnчтобы не быть бесконечным циклом (с той же страницы)
Кит Смайли
5
Это плохое решение, так как файл TERMпользователя может иметь другое значение .tmux.conf. Лучше проверить, установлена ​​ли TMUXпеременная или нет.
Кусалананда
104

Ответ @ StarNamer, как правило, точный, хотя я обычно включаю следующие тесты, чтобы убедиться, что (1) tmux существует в системе, (2) мы в интерактивной оболочке и (3) tmux не пытается работать в сам:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Рекомендации

user7089
источник
1
Хорошо, я нуждался commandпрежде, но не понимал, что это существовало.
Freedom_Ben
2
это execутверждение не позволяет вам выйти из tmux без выхода из всего терминала! : |
Луи Мэддокс
5
@LouisMaddox: execзаменяет текущий процесс новым - в этом случае он заменяет оболочку входа в bash на tmux, поэтому при выходе из tmux нет другого терминала, к которому можно было бы вернуться :)
Марк К Коуэн
1
@rjt Это верно, это начинает новый сеанс по дизайну. Если вы предпочитаете подключаться к существующему сеансу tmux, просто замените его exec tmuxна предпочитаемый вами вариантtmux attach
user7089
2
вместо того, чтобы exec tmuxиспользовать его, у exec tmux new-session -A -s mainменя всегда будет сеанс с именем main, и я присоединяюсь к нему (вместо создания нового сеанса каждый раз, когда я подключаюсь к своей удаленной машине), но он не завершится сбоем, как при использовании, tmux attachесли сеанс недоступен (находится здесь: unix.stackexchange.com/a/176885/256942 )
Верена Хауншмид
16

Добавление строки как

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

в вашем файле bashrc, вероятно, сделает эту работу. Обратите внимание, что эта строка выйдет из ssh и завершит соединение, как только вы отсоединитесь или выйдите из tmux. Мне нравится эта конфигурация, поскольку она сохраняет нажатия клавиш для разрыва соединения. Но если вы не любите это (что я считаю очень маловероятным) и предпочитаете оставаться в оболочке входа после завершения, просто удалите exitчасть:

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

Также обратите внимание , вы не должны обернуть tmux attachс exec, так как это может привести соединение будет закрыто , когда нет tmux сессий прикрепиться к.

huangzonghao
источник
Я добавил эту строку в мой .bashrc, но теперь, когда я запускаю терминал, я получаю несколько сообщений: /home/z/.tmux.conf:10: нет текущего сеанса (сообщение повторяется для строк 11, 13, 14 15). Это такие строки, как "установить команду по умолчанию" exec bash "" и "установить терминал по умолчанию" screen-256color "
Мэтт Г.
@ MattG Чувствую, что что-то не так с файлом конфигурации tmux.
Хуанцзунхао
5

Есть команда, chshкоторая меняет оболочку входа в систему. Consult man chsh.

Павел
источник
6
tmuxэто не оболочка, это терминальный мультиплексор, такой как экран GNU. Интересно, что он поддерживает -cопцию в соответствии с man-страницей , поэтому он может работать как оболочка, достаточная для использования в качестве оболочки входа в систему, но я подозреваю, что она не будет работать должным образом во всех ситуациях, например, при графическом входе через gdm / kdm. ,
Микель
1
Хотя это разумно и подтверждается документацией, похоже, что оно нарушает прямое выполнение команд через SSH (что-то вроде ssh $some_server echo foo).
n.st
3
tmux, по крайней мере, с 1.8 в Ubuntu добавляет себя /etc/shells, так что это действительная оболочка входа в систему.
Клейтрон
2
Для этого необходимо настроить default-shellпараметр в конфигурации tmux, чтобы он указывал на фактическую оболочку.
Кусалананда
4

Я успешно использую

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

по моему .zshrc. Если вы используете bash, поместите его в свой .bashrc.


Я также только что попытался установить в tmuxкачестве моей оболочки по умолчанию ( chsh -s $(which tmux)), и это, кажется, нарушает прямое выполнение команды через SSH, например ssh $some_server echo foo, не будет производить никакого вывода.

n.st
источник
3

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

А затем нажмите на «командную» панель. введите описание изображения здесь

Установите флажок «Запустить пользовательскую команду вместо моей продажи» и напишите любую команду, которую вы хотите выполнить при запуске вашего терминала.

user174935
источник
1

Ни один из приведенных выше ответов exec tmuxне помог мне - не позволяет мне закрыть tmux, не выходя из оболочки (независимо от того, открывается ли он с помощью Ctrl+ Tили из меню приложения).

Я использую Linux Mint, который позволяет вам отображать определенные горячие клавиши на команды, и (некошерно, как это может быть на некоторых ..) У меня есть оболочки bash с командами, начинающимися там, например, Win+ Alt+ Bделает какое-то замысловатое bash -exec(vim)выражение для отредактируйте мой .bashrc, чтобы он действовал как обычная оболочка.

tmux загружается, а не vim в этой ситуации после размещения вышеупомянутого в верхней части моего .bashrc. Я завернул строку выполнения tmux в другой оператор if, проверив, что он работает в интерактивном режиме.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

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

Луи Мэддокс
источник
Добавление амперсанда решило бы эту проблему следующим образом. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Даниэль Шато
1

В дополнение к ответу @Louis Maddox я выполню часть tmux с;

(exec tmux attach || exec tmux new-session)
devrimbaris
источник
Я использую exec sh -c 'tmux a || tmux', что (после просмотра вашего ответа), вероятно, приведет к тому, что плохие вещи произойдут, если tmux не сможет запуститься по какой-либо причине ..... спасибо, теперь я буду использовать вашу :)
Mark K Cowan
1
tmux new -A -s mysessionвероятно, тоже будет работать.
пул
1

Это по моему ~/.profile(я использую ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Если TMUXпеременная окружения не установлена ​​/ пуста, значит, мы не в сеансе tmux, так что ...

Если tmux has-sessionвозвращается с нулевым статусом выхода (true), существует доступный сеанс для присоединения. Прикрепить к нему.

Если нет, создайте новый сеанс.

Также возможно использовать в tmuxкачестве оболочки для входа. Однако, если вы сделаете это, убедитесь, что default-shellв вашем ~/.tmux.confфайле установлена фактическая оболочка (дополнительную информацию об этом смотрите в руководстве по tmux).

Кусалананда
источник
1

Вы можете (и на данный момент, вероятно, должны) использовать chshкоманду для установки tmux в качестве оболочки по умолчанию, а затем добавить следующее в .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Просто не забудьте изменить путь в конце строки.

Блажей Михалик
источник
1

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

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

На основании этих ответов:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

yosefrow
источник
0

Добавьте это в свой ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
источник
1
Я думаю, вы неправильно поняли вопрос, приятель! ;)
PhilT
-3

Как уже отмечал в своем комментарии Микель, использование tmux в качестве оболочки для входа может иметь побочные эффекты. Но вы можете сделать tmuxвашу оболочку по умолчанию, буквально. Пользовательская оболочка по умолчанию определена в / etc / passwd. Таким образом, вы можете стать пользователем root и отредактировать / etc / passwd, например, sudo vi /etc/passwdпоиск строки, начинающейся с вашего имени пользователя. Это, вероятно, заканчивается :/bin/bash. Измените / bin / bash на / usr / bin / tmux, и теперь tmux - это ваша оболочка входа по умолчанию.

Однако нет никаких гарантий, что это не вызовет проблем!

Что может работать лучше, так это НЕ делать ничего, что требует привилегий root. Я попытался бы создать файл в моей домашней директории с именем .bash_login и запустить tmux из этого файла: `echo" tmux "> ~ / .bash_login.

Это должно сработать, но вы должны попытаться найти сами, потому что документация bash не очень точна о том, какой файл читается и когда выполняется.

Bananguin
источник
2
То, что описывает ваш первый абзац, это то, что chshделает! За исключением того, что ваш путь требует наличия прав root и подвержен ошибкам. Запуск tmuxот .bash_loginэто более вероятно , сломать удаленные входы.
Жиль