Как выполнить команду оболочки из .tmux.conf

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

Как выполнить команду оболочки из .tmux.conf или автоматически при запуске tmux, не вводя никаких дополнительных команд?

Как я могу создать псевдоним, функцию или скрипт, который сведётся к, например

tmuxirc -> tmux + irssi

Хотя это не кажется тем, что вы искали, решение для:

Как выполнить команду оболочки из .tmux.conf

это run-shell или, в сокращённой форме, run. Из man-страницы tmux:

run-shell shell-command
               (alias: run)
         Выполняет shell-command в фоновом режиме без создания окна.
         После завершения, любой вывод в stdout отображается в режиме
         копирования. Если команда не завершится успешно, статус выхода
         также отображается.

Если вам нужно тихо запустить скрипт в фоновом режиме при каждом запуске tmux, вы можете использовать run "command > /dev/null".

Похоже, вы хотите вызывать tmux из вашей оболочки, а не делать это изнутри tmux, поэтому .tmux.conf — это не то место. Вы можете использовать псевдоним оболочки (разместите это в вашем .bashrc для повторного использования):

alias tmuxirc="tmux new-session -s irc irssi"

Я делаю что-то подобное со скриптом. Когда я хочу запустить tmux с моей конфигурацией для разработки, я вызываю его. Сам скрипт выглядит следующим образом:

#!/bin/sh
tmux has-session -t development
if [ $? != 0 ]; then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development 'cd /var/www/htdocs/' C-m
    tmux send-keys -t development 'vim' C-m
    tmux split-window -v -t development
    tmux split-window -v -t development
    tmux select-layout -t development main-horizontal
    tmux send-keys -t development:0.1 'cd /var/www/htdocs/' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:1 'cd /var/www/htdocs/' C-m
    tmux select-window -t development:0
fi
tmux attach -t development

Что мне это даёт? Сеанс tmux с 2 окнами: окно 1 содержит Vim-сеанс в верхней части экрана, с двумя терминалами в нижней трети экрана, всё настроено на мой каталог /var/www/htdocs/. Окно 2 — это просто консоль во весь экран. Приятно то, что он не создаст сеанс заново, если он уже существует, он просто подключится к нему.

В tmux есть команда display-message, из его man-страницы:

display-message [-p] [-c target-client] [-t target-pane] [message]

(псевдоним: display)

Отображает сообщение. Если указан параметр -p, вывод печатается в stdout, иначе он отображается в строке состояния target-client. Формат сообщения описан в разделе FORMATS; информация берется из target-pane, если указан -t, иначе используется активная панель для сеанса, подключенного к целевому клиенту.

А в разделе FORMATS есть переменная под названием session_name, она будет заменена на имя сеанса, если вы используете ее в формате #{session_name}.

Попробуйте выполнить tmux display-message -p '#{session_name}', когда вы находитесь в сеансе tmux. Возможно, вы увидите число, это идентификатор сеанса, к которому вы подключены. Выполните tmux ls, чтобы проверить список сеансов.

Однако, когда вы запускаете tmux с tmux new -s myproject, вы увидите myproject в качестве вывода, а не число, потому что вы указали имя сеанса при запуске tmux.

Итак, мое решение – поместите часть кода в файл ~/.bashrc:

# [tmux] загружает скрипты в ~/.tmux при создании новой панели
# порядок загрузки: __before__.sh, ${session_name}.sh, __after__.sh
function tmux_load_startup_scripts_by_session_name() {  
  if [[ -n ${TMUX} ]]; then
    local env_before_script="${HOME}/.tmux/__before__.sh"
    [[ -f "${env_before_script}" ]] && { . "${env_before_script}"; }
    local env_main_script="${HOME}/.tmux/$(tmux display-message -p '#{session_name}').sh"
    [[ -f "${env_main_script}" ]] && { . "${env_main_script}"; }
    local env_after_script="${HOME}/.tmux/__after__.sh"
    [[ -f "${env_after_script}" ]] && { . "${env_after_script}"; }
  fi
}
tmux_load_startup_scripts_by_session_name  

Использование

mkdir ~/.tmux
cat "__before__.sh" > ~/.tmux/__before__.sh
cat "__after__.sh" > ~/.tmux/__after__.sh
cat "sample.sh" > ~/.tmux/sample.sh
tmux new -s sample

Вы увидите вывод на каждой панели, которую создадите:

__before__.sh
sample.sh
__after__.sh

Преимущество этого решения в том, что вы можете указывать разные скрипты для разных проектов или окружений.

.

Ответ или решение

Для решения задачи автоматического выполнения команд оболочки при запуске tmux из файла .tmux.conf можно использовать несколько подходов, каждый из которых имеет свои особенности и преимущества. Давайте рассмотрим их детально.

Использование команды run-shell в файле .tmux.conf

Самым прямым способом запуска shell-команд из .tmux.conf является использование команды run-shell, что позволяет выполнить скрипт без создания нового окна в tmux. Это подходит для выполнения фоновых задач или скриптов, результат которых не требует непосредственного отображения в сессии:

run-shell "ваша команда > /dev/null"

Здесь вывод команды перенаправляется в /dev/null, что позволит запустить команду в фоновом режиме без визуального отображения ее результата в tmux.

Создание алиаса в .bashrc

Если вашей целью является внешний вызов tmux с определенными параметрами из оболочки, вы можете создать алиас в вашем .bashrc:

alias tmuxirc="tmux new-session -s irc 'irssi'"

Это позволит вам запускать tmux с irssi сессией простой командой tmuxirc в вашей терминальной оболочке.

Использование скрипта оболочки

Если вы хотите более сложную настройку с возможностью создания нескольких окон и панелей, разумно будет написать отдельный shell-скрипт. Пример такого скрипта мог бы выглядеть следующим образом:

#!/bin/sh
tmux has-session -t development
if [ $? != 0 ]; then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development 'cd /var/www/htdocs/' C-m
    tmux send-keys -t development 'vim' C-m
    tmux split-window -v -t development
    tmux split-window -v -t development
    tmux select-layout -t development main-horizontal
    tmux send-keys -t development:0.1 'cd /var/www/htdocs/' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:1 'cd /var/www/htdocs/' C-m
    tmux select-window -t development:0
fi
tmux attach -t development

Этот скрипт создает сессию development с несколькими окнами и панелями и настроенными командами, что позволяет максимально автоматизировать конфигурацию рабочего окружения.

Автоматическая загрузка скриптов на основе имени сессии

Для большего удобства и адаптивности, вы можете настроить автоматическую загрузку скриптов при создании новых панелей, основываясь на имени сессии. Это достигается с помощью функции в .bashrc, которая загружает скрипты из папки ~/.tmux на основе текущего имени сессии:

function tmux_load_startup_scripts_by_session_name() {  
  if [[ -n ${TMUX} ]]; then
    local env_before_script="${HOME}/.tmux/__before__.sh"
    [[ -f "${env_before_script}" ]] && . "${env_before_script}"
    local env_main_script="${HOME}/.tmux/$(tmux display-message -p '#{session_name}').sh"
    [[ -f "${env_main_script}" ]] && . "${env_main_script}"
    local env_after_script="${HOME}/.tmux/__after__.sh"
    [[ -f "${env_after_script}" ]] && . "${env_after_script}"
  fi
}
tmux_load_startup_scripts_by_session_name

Заключение

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

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

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