Имеет ли терминальный мультиплексор какие-либо преимущества при использовании с оконным менеджером листов?

11

Как терминальные мультиплексоры (screen, tmux), так и управляющие окнами тайлы на основе клавиатуры (ratpoison, dwm, xmonad) предоставляют схожую функциональность. Есть ли польза в использовании обоих одновременно? А как насчет проблем, которые могут возникнуть?

Pubby
источник
1
Они делают? Единственная особенность, которую я могу вспомнить, - это возможность разбить окно на множество
Майкл Мрозек
@MichaelMrozek У меня 0 опыта работы с любым из них, поэтому я просто собираюсь кое-что прочитать. Было бы здорово, если бы вы могли указать на некоторые различия.
Пабби
3
Имейте в виду, что для оконного менеджера каждое окно - это просто окно - и это все. Поэтому многие связанные с терминалом вещи, кроме разделения окон, недоступны для WM.
sr_

Ответы:

9

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

Эмиль
источник
16

Дополнительным преимуществом терминальных мультиплексоров является то, что ваши сеансы мультиплексора будут по-прежнему активны, и вы сможете подключиться к ним, даже если X (сеанс вашего рабочего стола) выйдет из строя или вы вышли из X.

Янош
источник
2

Используйте и менеджер окон, и мультиплексор терминала.

Объедините их возможности и преимущества, чтобы добиться еще большей синергии. На моей установке i3 я регулярно отображаю несколько терминалов одновременно, но все они подключены к одному сеансу tmux , поэтому я могу отображать все окна tmux в любом из терминалов .

Фактически, я использую возможности листов i3для замены / расширения функциональности разделения / перемещения оконного мультиплексора терминала, чтобы (imho) получить лучшее из обоих миров.

Приведенный ниже скрипт используется здесь для управления сеансом / обнаружением соединения и очистки при запуске терминала:

#!/bin/bash
# This script attaches the terminal to a common session, where all
# terminals can show any window of the main tmux session independently
# This script also cleans up "old" sessions
# Todo: Cosmetic fix-ups. Make less verbose.

DEBUG="y"
showRun(){ echo Will run: $@;test -z $DEBUG||read -n1 -p"Press ENTER";$@; }

SNAME=${1:-XyZ}

if ! tmux has -t $SNAME; then
    echo -n "Session $SNAME not found, creating it: "
    showRun exec tmux new-session -s $SNAME;
else
    echo -n "Session $SNAME found: "
    MySESSION=$(tmux ls | grep -E "^$SNAME:.*\(attached\)$")
    echo $MySESSION;
    if [ -z "$MySESSION" ] ; then
        echo "Session $SNAME unattached, seizing it:"
        showRun exec tmux attach -t $SNAME \; new-window
    else
        echo "Session $SNAME already attached, finding grouped Sessions:"
        REGEX="group ([^)]*)"
        [[ $MySESSION =~ $REGEX ]]
        GNAME=${BASH_REMATCH[1]}
        GSESSIONS=$(tmux ls | grep "group $GNAME)" | grep -v $SNAME:)
        echo "$GSESSIONS"
        if [ -z "$GSESSIONS" ]; then
            echo "No sessions in group with $SNAME found, creating new one:"
            showRun exec tmux new-session -t $SNAME \; new-window
        else
            FGSESSIONS=$(echo "$GSESSIONS" | grep -v attached )
            if [ -z "$FGSESSIONS" ]; then
                echo "No free sessions in group $GNAME found, creating new one:"
                showRun exec tmux new-session -t $SNAME \; new-window
            else
                echo -e "Free grouped Sessions:\n $FGSESSIONS";
                if echo "$FGSESSIONS" | tail -n +2 | grep . > /dev/null; then
                    echo "Several detached Sessions found, cleaning up:"
                    echo "$FGSESSIONS" | while read SID x ; do
                        if [ -z $KEEPSID ]; then
                            KEEPSID=${SID%:*};
                            echo "Keeping session $KEEPSID for takeover after cleanup"
                        else
                            echo "Cleaning up old detached session $SID"
                            tmux kill-session -t ${SID%:}
                        fi;
                    done
                    KEEPSID=$(tmux ls|grep "group $GNAME)" | grep -v attached);
                    KEEPSID=${KEEPSID%: *}
                    echo "Attaching to session $KEEPSID:"
                    showRun exec tmux attach -t $KEEPSID \; new-window
                else
                    echo "Free session ( ${FGSESSIONS%: *} ) found, seizing it:"
                    showRun exec tmux attach -t ${FGSESSIONS%: *} \; new-window
                fi ;
            fi ;
        fi ;
    fi ;
fi
Алекс Страгиес
источник
1

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

Screen предлагает возможности последовательной консоли, но я просто использую специальное приложение (miniterm.py распространяется с python), когда мне это нужно. Иначе я не могу придумать ничего лишнего, что может сделать один, а другой нет, но один может сделать это проще, чем другой.

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

bobpaul
источник
0

Еще один полезный аспект терминального мультиплексора в этом сценарии - после подключения к удаленным серверам. Я нахожу типичный вариант использования

  1. Откройте окно терминала на моем локальном компьютере.
  2. SSH в удаленный сервер.
  3. tmux / screen теперь обеспечивает мультиплексирование на удаленном сервере, что позволяет легко открывать новые терминалы / оболочки на удаленном сервере. По сравнению с открытием второго терминала на локальном компьютере и повторным подключением со вторым ssh, это на один шаг меньше.
mathewguest
источник