Як я можу встановити мою оболонку за замовчуванням для запуску tmux


Відповіді:


46

Це, здається, працює ...

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

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

[[ $TERM != "screen" ]] && exec tmux

2
Для мене це також вимагало, [[ $- != *i* ]] && returnщоб не бути нескінченним циклом (з тієї ж сторінки)
Кіт Смілі

5
Це неправильне рішення, оскільки TERMможе бути встановлено якесь інше значення .tmux.confфайлом користувача. Краще перевірити TMUX, встановлена ​​чи ні змінна.
Kusalananda

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

Список літератури


1
Приємно, я був потрібний commandраніше, але не усвідомлював, що він існує.
Freedom_Ben

2
це execтвердження не дозволяє вийти з tmux, не закриваючи весь термінал! : |
Луї Маддокс

5
@LouisMaddox: execзамінює поточний процес новим - у цьому випадку він замінює оболонку входу bash на tmux, тому коли tmux виходить, немає іншого терміналу, щоб повернутися до :)
Mark K Cowan

1
@rjt Правильно, це починає нову сесію за дизайном. Якщо ви віддаєте перевагу приєднанню до існуючого сеансу tmux, просто замініть exec tmuxобраний смакtmux attach
user7089

2
замість цього exec tmuxя використовую, exec tmux new-session -A -s 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 сесій прикріпитися до.


Я додав цей рядок до свого .bashrc, але тепер, коли я запускаю термінал, я отримую кілька повідомлень: /home/z/.tmux.conf:10: немає поточного сеансу (повідомлення повторюється для рядків 11, 13, 14 , 15). Ці рядки є такими, як "встановити команду за замовчуванням" exec bash "" і "встановити за замовчуванням" термінал "screen-256color".
Matt G

@MattG Ви можете відчути, що з файлом конфігурації tmux щось не так.
huangzonghao

5

Існує команда, chshяка змінює оболонку входу. Проконсультуйтеся 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, щоб вказати на фактичну оболонку.
Kusalananda

4

Я успішно використовую

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

в моїй .zshrc. Якщо ви використовуєте bash, помістіть його .bashrcзамість цього.


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


2

Перейдіть до преференцій терміналу. введіть тут опис зображення

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

Поставте прапорець "Запустити спеціальну команду замість моєї продажу" і напишіть будь-яку команду, яку ви хочете виконати при запуску терміналу.


1

Жоден з перерахованих вище відповідей не працював для мене - 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 &
Даніель Шато

1

Додавши до відповіді @Louis Maddox, я би виконав команду tmux за допомогою;

(exec tmux attach || exec tmux new-session)

Я використовую exec sh -c 'tmux a || tmux', що (подивившись на вашу відповідь), ймовірно, призведе до поганих випадків, якщо tmux з якихось причин не вдасться запуститись ..... дякую, я з цього моменту буду використовувати ваш :)
Марк K Cowan

1
tmux new -A -s mysessionнапевно, теж буде працювати.
poolie

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повертається з нульовим статусом виходу (справжній), до нього можна отримати доступний сеанс. Прикріпіть до нього.

Якщо ні, створіть новий сеанс.

Можна також використовувати 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


0

Додайте це до свого ~/.tmux.conf

set -g default-command /usr/local/bin/fish

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 не дуже точна щодо того, який файл читається та виконується коли.


2
Перший параграф описує те, що chshробить! За винятком того, що ваш спосіб вимагає використання root та не схильний до помилок. Ті, що йдуть tmuxвід .bash_loginце більш ймовірно , зламати віддалені входи.
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.