Я хотів би, щоб моя башма за замовчуванням перейшла прямо в tmux, а не завжди потрібно вводити tmux кожен раз.
Я хотів би, щоб моя башма за замовчуванням перейшла прямо в 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тому я завжди матиму сеанс, який називається основним, і додаватиму його (замість того, щоб створювати новий кожного разу, коли я підключаюсь до своєї віддаленої машини), але він не вийде з ладу, як при використанні, 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яка змінює оболонку входу. Проконсультуйтеся 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, який дозволяє вам відображати певні гарячі клавіші до команд, і (не коштує, як це може бути для деяких ..) У мене є базові оболонки з командами, що починаються там, наприклад 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повертається з нульовим статусом виходу (справжній), до нього можна отримати доступний сеанс. Прикріпіть до нього.
Якщо ні, створіть новий сеанс.
Можна також використовувати 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щоб не бути нескінченним циклом (з тієї ж сторінки)