Я бы хотел, чтобы моя оболочка 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чтобы не быть бесконечным циклом (с той же страницы)