Вопрос или проблема
Я написал простой скрипт для создания или присоединения к сессии tmux, названной в честь текущего терминального эмулятора. Скрипт работает, как задумано, в большинстве случаев, но я сталкиваюсь с проблемой, когда присоединяюсь к отсоединенной сессии.
if [ -z "$TMUX" ]; then
SESH=$(ps -p $PPID -o comm=)
if ! tmux has-session -t "$SESH" 2>/dev/null; then
tmux new-session -s "$SESH"
else
tmux attach-session -t "$SESH"
fi
if ! tmux has-session -t "$SESH" 2>/dev/null; then
exit
fi
fi
Когда я выполняю kill-session или вручную закрываю все окна, терминальный эмулятор завершает работу. Когда я отсоединяюсь от сессии, терминальный эмулятор остается открытым. Однако, когда я присоединяюсь к отсоединенной сессии, а затем выполняю kill-session или вручную закрываю все окна, терминальный эмулятор не закрывается; только сессия tmux завершается.
Как я могу изменить мой скрипт, чтобы гарантировать, что терминальный эмулятор закрывается, когда я завершаю сессию tmux после того, как присоединился к ней?
Ответ или решение
Чтобы обеспечить выход терминального эмулятора при завершении сессии tmux, когда вы подключаетесь к уже существующей сессии, вам потребуется внести некоторые изменения в ваш скрипт. В этом случае основной задачей является управление поведением вашего терминального эмулятора на основе статуса сессии tmux. Ниже представлены шаги и изменения, которые помогут решить вашу проблему.
Шаг 1: Измените логику вашего скрипта
Вам нужно отслеживать состояние сессии tmux и управлять завершением процесса терминального эмулятора в зависимости от состояния сессии. Добавим переменную, которая будет определять, была ли запущена новая сессия или использовалась уже существующая.
Шаг 2: Пример модифицированного скрипта
Вот модифицированный вариант вашего скрипта:
#!/bin/bash
if [ -z "$TMUX" ]; then
SESH=$(ps -p $PPID -o comm=)
if ! tmux has-session -t "$SESH" 2>/dev/null; then
tmux new-session -s "$SESH" && exit
else
tmux attach-session -t "$SESH"
fi
# После выхода из tmux, проверяем, остались ли сессии
if ! tmux has-session -t "$SESH" 2>/dev/null; then
exit 0 # Выход из скрипта
fi
else
# Если мы уже в сессии tmux, выходим из нее по команде
tmux kill-session -t "$SESH"
exit 0
fi
Шаг 3: Объяснение изменений
-
Проверка на существование сессии: Если сессия не существует, мы создаем ее и выходим из скрипта с помощью
&& exit
. Это предотвращает дальнейшую обработку, что может привести к ошибкам. -
Использование
tmux kill-session
: При использовании командыtmux kill-session
необходимо удостовериться, что после завершения сессии происходит выход из скрипта. Это необходимо, чтобы терминальный эмулятор знал, что сессия закрыта и можно завершить его работу. -
Проверка на существующие сессии: Если после отключения (detach) вы вызовете команду kill-session, скрипт проверит, остались ли активные сессии. Если нет — выходим из терминального эмулятора.
Шаг 4: Настройка вашего терминала
Дополнительно, вы можете настраивать поведение вашего терминального эмулятора, чтобы он закрывался автоматически при завершении всех связанных процессов. Убедитесь, что в настройках терминала включена опция "Закрыть терминал при завершении процесса".
Заключение
Внедрив вышеуказанные изменения в ваш скрипт, вы сможете гарантировать, что терминальный эмулятор закроется одновременно с завершением сессии tmux, независимо от того, была ли она создана или подключена. Это улучшит общее поведение вашего рабочего пространства и сделает его более предсказуемым.