Как установить tmux в качестве оболочки по умолчанию?

Вопрос или проблема

Я бы хотел, чтобы моя оболочка bash по умолчанию сразу запускалась в tmux вместо того, чтобы мне приходилось вводить tmux каждый раз.

Ответ @StarNamer в целом точен, хотя я обычно добавляю следующие проверки, чтобы убедиться, что

  1. tmux существует на системе
  2. мы находимся в интерактивной оболочке, и
  3. tmux не пытается запуститься внутри себя

Итак, я добавил бы это в .bashrc:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Ссылки

Запуск 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

На основе этих ответов:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110

Я успешно использую

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 завершает работу, а активная сессия остается.

Здесь, кажется, есть два класса ответов:

  1. Те, которые просто «запускают tmux» (exec tmux) с использованием различных техник и (предпочтительно) оберток для обработки ошибок. Например, exec tmux

  2. Те, которые сначала пытаются присоединиться к существующему 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 :

  1. $TMUX сообщает, находитесь ли вы в “оболочке tmux” или нет (вы также можете увидеть это с помощью $TERM), если мы уже находимся в tmux, мы ничего не делаем
  2. /usr/bin/tmux has-session сообщает вам, существует ли на компьютере сеанс tmux или нет, если сеанс tmux существует, мы хотим его “открыть” (подключить) :
  3. tmux -u a -t 0 снова открывает (в юникоде -u) сеанс tmux по умолчанию 0 (измените 0 на название вашего сеанса по умолчанию)
  4. иначе tmux -u открывает tmux в юникоде, если сервер tmux не существует
  5. теперь вам стоит рассмотреть плагины 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, поскольку она позволяет сразу начинать работу в мультиплексированной среде. Основные критерии такой настройки:

  1. Проверка наличия tmux на системе: Убедиться, что tmux установлен и доступен.
  2. Проверка, что оболочка интерактивная: Используются переменные и взаимосвязи для проверки, например, переменная $PS1, чтобы убедиться, что вы находитесь именно в интерактивной оболочке.
  3. Проверка, что 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-среде.

Оцените материал
Добавить комментарий

Капча загружается...