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