Я бы хотел, чтобы моя оболочка bash по умолчанию шла прямо в tmux, вместо того, чтобы постоянно вводить tmux каждый раз.
Я бы хотел, чтобы моя оболочка bash по умолчанию шла прямо в tmux, вместо того, чтобы постоянно вводить tmux каждый раз.
Ответы:
Это похоже на работу ...
https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
Просто добавьте следующую строку кода bash в ваш .bashrc перед вашими псевдонимами; код для других оболочек очень похож:
[[ $TERM != "screen" ]] && exec tmux
TERM
пользователя может иметь другое значение .tmux.conf
. Лучше проверить, установлена ли TMUX
переменная или нет.
Ответ @ StarNamer, как правило, точный, хотя я обычно включаю следующие тесты, чтобы убедиться, что (1) tmux существует в системе, (2) мы в интерактивной оболочке и (3) tmux не пытается работать в сам:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
Рекомендации
command
для проверки существования команды - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
вместо which
проверки наличия команд - https://unix.stackexchange.com/a/85250$PS1
для проверки интерактивной оболочки - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
переменной среды "для всех программ, работающих в tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
прежде, но не понимал, что это существовало.
exec
утверждение не позволяет вам выйти из tmux без выхода из всего терминала! : |
exec
заменяет текущий процесс новым - в этом случае он заменяет оболочку входа в bash на tmux, поэтому при выходе из tmux нет другого терминала, к которому можно было бы вернуться :)
exec tmux
на предпочитаемый вами вариантtmux attach
exec tmux
использовать его, у exec tmux new-session -A -s main
меня всегда будет сеанс с именем main, и я присоединяюсь к нему (вместо создания нового сеанса каждый раз, когда я подключаюсь к своей удаленной машине), но он не завершится сбоем, как при использовании, tmux attach
если сеанс недоступен (находится здесь: unix.stackexchange.com/a/176885/256942 )
Добавление строки как
[ -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 сессий прикрепиться к.
Есть команда, chsh
которая меняет оболочку входа в систему. Consult man chsh
.
tmux
это не оболочка, это терминальный мультиплексор, такой как экран GNU. Интересно, что он поддерживает -c
опцию в соответствии с man-страницей , поэтому он может работать как оболочка, достаточная для использования в качестве оболочки входа в систему, но я подозреваю, что она не будет работать должным образом во всех ситуациях, например, при графическом входе через gdm / kdm. ,
ssh $some_server echo foo
).
/etc/shells
, так что это действительная оболочка входа в систему.
default-shell
параметр в конфигурации tmux, чтобы он указывал на фактическую оболочку.
Я успешно использую
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
по моему .zshrc
. Если вы используете bash, поместите его в свой .bashrc
.
Я также только что попытался установить в tmux
качестве моей оболочки по умолчанию ( chsh -s $(which tmux)
), и это, кажется, нарушает прямое выполнение команды через SSH, например ssh $some_server echo foo
, не будет производить никакого вывода.
Ни один из приведенных выше ответов 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 &
В дополнение к ответу @Louis Maddox я выполню часть tmux с;
(exec tmux attach || exec tmux new-session)
exec sh -c 'tmux a || tmux'
, что (после просмотра вашего ответа), вероятно, приведет к тому, что плохие вещи произойдут, если tmux не сможет запуститься по какой-либо причине ..... спасибо, теперь я буду использовать вашу :)
tmux new -A -s mysession
вероятно, тоже будет работать.
Это по моему ~/.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).
Вы можете (и на данный момент, вероятно, должны) использовать chsh
команду для установки tmux в качестве оболочки по умолчанию, а затем добавить следующее в .tmux.conf
:
set-option -g default-shell /path/to/your/favourite/shell
Просто не забудьте изменить путь в конце строки.
Я объединил обширные проверки с условной проверкой сеанса и включил в нее свой собственный анализ, чтобы создать сеанс по умолчанию, который подключен или еще создан. Если вы не находитесь в другом сеансе 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
На основании этих ответов:
Добавьте это в свой ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Как уже отмечал в своем комментарии Микель, использование 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 не очень точна о том, какой файл читается и когда выполняется.
chsh
делает! За исключением того, что ваш путь требует наличия прав root и подвержен ошибкам. Запуск tmux
от .bash_login
это более вероятно , сломать удаленные входы.
[[ $- != *i* ]] && return
чтобы не быть бесконечным циклом (с той же страницы)