Вопрос или проблема
Как выполнить команду оболочки из .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
.