Вопрос или проблема
Я бы хотел, чтобы моя оболочка bash по умолчанию сразу запускалась в tmux вместо того, чтобы мне приходилось вводить tmux каждый раз.
Ответ @StarNamer в целом точен, хотя я обычно добавляю следующие проверки, чтобы убедиться, что
tmux
существует на системе- мы находимся в интерактивной оболочке, и
tmux
не пытается запуститься внутри себя
Итак, я добавил бы это в .bashrc
:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
Ссылки
- Использование команды bash
command
для проверки существования команды – http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDS - Почему следует использовать
command
вместо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_PANES
Запуск tmux при каждом входе в оболочку, из справочника Arch, кажется, работает. Просто добавьте следующую строку кода bash в ваш .bashrc
перед вашими алиасами; код для других оболочек очень похож:
[[ $TERM != "screen" ]] && exec tmux
Добавление строки типа
[ -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 для присоединения к ним.
Я объединил обширные проверки с проверкой условных сеансов и добавил свой акцент, чтобы создать сеанс по умолчанию, который подключается или создается. Если вы не находитесь в другом сеансе 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
На основе этих ответов:
Я успешно использую
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
в моем .zshrc
. Если вы используете bash, поместите это в ваш .bashrc
.
Я также попробовал установить tmux
в качестве своей оболочки по умолчанию (chsh -s $(which tmux)
), и это, похоже, нарушает прямое выполнение команд через SSH, например ssh $some_server echo foo
не выдает никакого вывода.
Перейдите в настройки терминала.
Затем нажмите на панель “команда”.
Проверьте “Выполнить пользовательскую команду вместо моего продаж” и напишите любую команду, которую вы хотите выполнить при запуске вашего терминала.
Существует команда chsh
, которая изменяет оболочку входа. Обратитесь к man chsh
.
Сделайте tmux
вашей оболочкой входа, но не забудьте сначала настроить параметр default-shell
для tmux
!
Пример ~/.tmux.conf
:
set-option -g default-shell "/bin/bash"
Вы должны сначала протестировать это, прежде чем устанавливать tmux
в качестве вашей оболочки входа.
Добавляя к ответу @Louis Maddox, я бы выполнил часть tmux следующим образом;
(exec tmux attach || exec tmux new-session)
Это в моем ~/.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 для получения дополнительной информации об этом).
Ни один из приведенных выше ответов не сработал для меня – 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 # если оболочка загружена интерактивно, запускаем tmux
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
fi
fi
Вы могли бы объединить все это в одну строку, но для читаемости, я думаю, это нормально.
Вы могли бы (и на данный момент, вероятно, должны) использовать команду sudo chsh $(logname)
, чтобы установить /usr/bin/tmux
, или любой другой путь к нему, в качестве оболочки по умолчанию, затем добавьте следующее в ~/.tmux.conf
:
set-option -g default-shell </path/to/your/favourite/shell>
Я использую следующее для zsh.
if command -v tmux &> /dev/null && [[ -z "$TMUX" ]]
then
tmux new-session -c $PWD
fi
Разница с существующими решениями в том, что если вы используете DE и пытаетесь использовать ‘Щелчок правой кнопкой мыши > Открыть в терминале’, он откроется в текущем расположении.
Еще одно отличие заключается в том, что в этом конкретном случае мы не используем exec
. Пожалуйста, прочтите блог Марка Хансена под названием Аргумент в пользу автоматического запуска Tmux.
Некоторые люди предлагают использовать exec tmux, это заменяет весь процесс вашей оболочки на tmux и может привести к сбоям, если tmux имеет ошибки. По крайней мере, запуск tmux напрямую вернется к вашему терминалу, если tmux имеет ошибку. Это также позволяет легко удалить сеанс tmux, если он вам не нужен – просто отсоединитесь. Дополнительный процесс – это небольшая плата за это.
Для Fish shell я следую аналогичным шагам. Я помещаю следующее в conf.d
:
if status is-interactive
if not set -q TMUX
tmux new-session -c $PWD
end
end
Есть также проблема Tiny Frames.
tmux автоматически изменяет размер своего оконного кадра на размер наименьшего терминала, прикрепленного к сеансу. Чаще всего это приводит к тому, что крошечное окно терминала ноутбука делает используемое пространство на огромном экране настольного компьютера крошечным.
Даже на моей машине подключение к одному сеансу через два терминала не заканчивается хорошо. Одна и та же команда дублируется в обоих терминалах.
Дело в том, что использование кода, как показано ниже, не работает для меня.
if tmux has-session 2>/dev/null; then
tmux attach
else
exec tmux
fi
У меня есть скрипт fish, который выполняет следующее:
- если нет сеанса, то создается новый сеанс
- если есть неприсоединенный сеанс, предлагается вариант подключения к одному из них (после присоединения, переход в $PWD)
- если не хотите присоединяться к неприсоединенному сеансу, то создается новый сеанс
Вот скрипт (я разместил его в conf.d
):
if status is-interactive
if not set -q TMUX
if tmux list-sessions &>/dev/null
set -l array_unattached
for i in (tmux list-sessions -F "#{session_attached} #{session_name} \"#{session_path}\"")
if test (echo $i | cut -d' ' -f1) -eq 0
set -a array_unattached (echo $i | cut --complement -d ' ' -f 1)
end
end
if set -q array_unattached[1]
set -l selection (printf '%s\n' $array_unattached | rofi -dmenu -p "Выберите сеанс tmux")
if test $status -eq 0
set -l session_name (echo $selection | cut -d ' ' -f 1)
tmux send-keys -t $session_name:1.1 "^C"
tmux send-keys -t $session_name:1.1 "cd $PWD &> /dev/null" ENTER
tmux attach-session -t $session_name:1.1
else
tmux new-session -c $PWD
end
end
else
tmux new-session -c $PWD
end
end
end
Добавьте приведенную ниже строку в ~/.config/fish/conf.d/omf.fish
if not set -q TMUX
set -g TMUX tmux new-session -d -s base
eval $TMUX
tmux attach-session -d -t base
end
Перечисленное выше работало на Fedora 34. Однако, при выходе, только tmux завершает работу, а активная сессия остается.
Здесь, кажется, есть два класса ответов:
-
Те, которые просто «запускают tmux» (
exec tmux
) с использованием различных техник и (предпочтительно) оберток для обработки ошибок. Например,exec tmux
-
Те, которые сначала пытаются присоединиться к существующему tmux, а затем возвращаются к первому методу, если не существует существующего сеанса. Например,
tmux attach || exec tmux
.
Этот второй метод можно упростить и сделать более эффективным с помощью:
exec tmux new -A
Флаг -A
к new
(сокращение от new-session
):
- Проверяет, существует ли уже существующий сеанс tmux
- Присоединяется к нему, если да
- Если нет, запускает новый сеанс
Кроме того, что он более краток, чем более длинная форма, он также теоретически немного более эффективен, поскольку tmux должен запускаться только один раз, а не потенциально дважды (один раз для проверки, второй для фактического выполнения, если он не работает).
Я использую немного более длинную форму лично:
exec tmux new -AD -t main -s main
Это:
- Убедитесь, что существует только одна группа сеансов и сеанс (названный
main
) - Отсоединяет любой другой работающий клиент tmux.
Тем не менее, я рекомендую обернуть это в оператор if
по ответу user7089.
Не совсем то, что было в оригинальном вопросе, но гибкая альтернатива – добавить
history -s "tmux attach"
в ваш ~/.profile
. Таким образом, при входе вы можете просто использовать стрелку вверх и Enter, чтобы снова запустить tmux.
это делает tmux открытым по умолчанию во всех новых оболочках пользователя
cmd='[ $TERM == screen ] || exec tmux'
echo -e "$cmd\n$(cat ~/.bashrc)" > ~/.bashrc
У меня была проблема, когда я не мог войти в систему (на Ubuntu 20.04). Я добавил следующее изменение к ответу huangzonghao:
# автозагрузка tmux - разместите в EOF (конце файла) внутри ~/.bashrc
# если оболочка интерактивная и задана переменная TMUX...
[[ $- == *i* ]] && [[ -z "${TMUX}" ]] && { tmux attach || exec tmux new-session && exit; }
если tmux уже установлен в вашей системе, сделайте так:
sudo usermod -s $(which tmux) ИМЯ_ПОЛЬЗОВАТЕЛЯ
теперь ваш пользователь настроен для использования tmux в качестве оболочки по умолчанию .
теперь настройте tmux в соответствии с вашей предпочитаемой оболочкой:
set-option -g default-shell "/bin/bash"
или любую другую конфигурацию, которую вы хотите ….
Примечание: tmux выполняет /bin/bash, поэтому /etc/bashrc
или $USER/.bashrc
загружаются сразу.
Если кто-то хочет всегда запускать сеанс tmux НО НЕ в Visual Studio Code, я сделал следующее.
Это в основном то же самое, что и @user7089 ответ, поэтому для объяснения посмотрите его ответ, я просто добавил часть исключения vscode
сделайте это в настройках вашего vscode settings.json
{
...
"terminal.integrated.profiles.linux": {
"bash": {
"path": "bash",
"icon": "terminal-bash"
},
...
},
"terminal.integrated.defaultProfile.linux": "bash",
"terminal.integrated.env.linux": {
"LAUNCHED": "vscode"
},
}
сделайте это в вашем ~/.bashrc
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$LAUNCHED" == "vscode" ]] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux new-session -A -s main
fi
Вот что я использую на openbsd (ksh, файл .profile) и archlinux (bash, файл .bashrc) :
if [[ $TMUX = "" ]]; then
/usr/bin/tmux has-session
if [[ $? -eq 0 ]]; then
tmux -u a -t 0
else
tmux -u
fi
fi
Объяснение, чтобы избежать вложенного tmux :
- $TMUX сообщает, находитесь ли вы в “оболочке tmux” или нет (вы также можете увидеть это с помощью $TERM), если мы уже находимся в tmux, мы ничего не делаем
/usr/bin/tmux has-session
сообщает вам, существует ли на компьютере сеанс tmux или нет, если сеанс tmux существует, мы хотим его “открыть” (подключить) :tmux -u a -t 0
снова открывает (в юникоде -u) сеанс tmux по умолчанию 0 (измените 0 на название вашего сеанса по умолчанию)- иначе
tmux -u
открывает tmux в юникоде, если сервер tmux не существует - теперь вам стоит рассмотреть плагины tmux: tmux-resurrect, tmux-continuum для автоматического загрузки ваших демонов в tmux.conf и сохранения ваших открытых панелей tmux
Не забудьте Ctrl+b d для отсоединения сеанса tmux, если вы хотите обычный терминал: полезно, когда ssh соединяется с удаленным хостом с tmux и для избегания мульти статусной панели tmux и для избегания использования Ctrl+b b для управления удаленным tmux
Добавьте это в ваш ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Как уже отметил Mikel в своем комментарии, использовать 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 не очень точна в отношении того, какой файл читается и выполняется когда.
.
Ответ или решение
Для автоматизации запуска tmux
при старте вашего интерактивного терминала в окружении Bash, необходимо внести изменения в файл конфигурации ~/.bashrc
. Tmux
— это мощный мультиплексор терминалов, который предоставляет возможность одновременно работать с несколькими терминальными сессиями в одном окне. Использование tmux
особенно удобно в случаях, когда необходимо поддерживать рабочие сессии даже после отключения от сервера. Ниже описан алгоритм настройки tmux
как запускаемого по умолчанию.
Теория
Настройка сессий tmux
при старте терминала позволит вам избежать необходимости вручную запускать tmux
каждый раз при входе в систему. Эта настройка особенно полезна при частом использовании tmux
, поскольку она позволяет сразу начинать работу в мультиплексированной среде. Основные критерии такой настройки:
- Проверка наличия
tmux
на системе: Убедиться, чтоtmux
установлен и доступен. - Проверка, что оболочка интерактивная: Используются переменные и взаимосвязи для проверки, например, переменная
$PS1
, чтобы убедиться, что вы находитесь именно в интерактивной оболочке. - Проверка, что
tmux
не запущен: Осуществляется через переменную окружения$TMUX
, индикатор того, что вы уже внутри сессииtmux
.
Пример
Для реализации вышеописанного алгоритма, добавьте в ваш файл ~/.bashrc
следующий код:
if command -v tmux &>/dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
tmux new -A -s default || exec tmux new-session && exit
fi
Детали:
command -v tmux &>/dev/null
: Проверка того, чтоtmux
установлен и доступен в PATH.[ -n "$PS1" ]
: Убедиться, что оболочка интерактивная.[[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]]
: Проверка, чтобы убедиться, что не происходит попытка вложенного запускаtmux
.[ -z "$TMUX" ]
: Условие, чтобы убедиться, что вы находитесь вне текущей сессииtmux
.tmux new -A -s default
: Попытка присоединиться к сессииdefault
или её создание при отсутствии. Флаг-A
служит для автоматического присоединения.
Применение
Эта настройка окажется полезной в нескольких сценариях:
- Администраторы серверов: Часто используют устойчивые сессии для управления процессами на отдалённых серверах.
- Разработчики: Могут сохранять состояние своей среды разработки, включая открытые файлы и запущенные процессы.
- Продвинутые пользователи: Получат выигрыш в скорости и эффективности, устранив утомительный шаг ручного запуска
tmux
.
Настройка описанного решения позволяет оптимизировать использование терминала, снизив количество рутинных операций и повысив продуктивность работы.
Заключение
Использование tmux
, автоматизированное на уровне конфигурации оболочки, — это эффективное средство улучшения рабочего процесса в командной строке. Будучи мощным инструментарий для управления сессиями, он особенно полезен в сложных или распределённых системах, где переключение между задачами и средами происходит часто. Надлежащее понимание работы с tmux
, а также грамотная настройка его автоматического запуска позволяют ощутимо улучшить качество и комфорт работы в shell-среде.