如何从 运行 shell 命令.tmux.conf
,或者在 tmux 启动时自动运行 shell 命令,而无需点击任何其他命令?
如何创建别名、函数或脚本,例如
tmuxrc -> tmux + irssi
答案1
虽然这似乎不是您想要的,但解决方案是:
如何从 .tmux.conf 运行 shell 命令
是run-shell
,或者其缩写形式是run
。从tmux
手册页:
run-shell shell-command (alias: run) Execute shell-command in the background without creating a win- dow. After it finishes, any output to stdout is displayed in copy mode. If the command doesn't return success, the exit sta- tus is also displayed.
如果您需要在每次启动时在后台静默启动脚本tmux
,您可以使用run "command > /dev/null"
.
答案2
听起来您想从 shell 外部调用 tmux,而不是从 tmux 内部执行此操作,所以这.tmux.conf
是错误的地方。您可以使用 shell 别名(将其放在您的中.bashrc
以供重用):
alias tmuxirc='tmux new-session -s irc irssi'
答案3
我用脚本做了类似的事情。当我想用我的开发配置启动 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
这给我的是一个有 2 个窗口的 tmux 会话,窗口 1 在屏幕顶部有一个 Vim 会话,在屏幕底部 3 左右有两个终端,全部指向我的 /var/www/htdocs/ 目录。 Window 2 只是一个全屏控制台。这样做的好处是,如果会话已经存在,它不会重新创建它,它只会附加到它。
答案4
其手册页中有一个display-message
命令:tmux
显示消息 [-p] [-c 目标客户端] [-t 目标窗格] [消息]
(别名:显示)
显示一条消息。如果给出 -p,则输出将打印到 stdout,否则将显示在目标客户端状态行中。消息的格式在FORMATS部分描述;如果给出 -t,则从目标窗格中获取信息,否则从附加到目标客户端的会话的活动窗格中获取信息。
在 FORMATS 部分中,有一个名为 的变量session_name
,如果您在格式中使用它,它将被会话的名称替换#{session_name}
。
tmux display-message -p '#{session_name}'
尝试在 tmux 会话中运行。也许你会看到一个数字,它是你附加的会话的 ID。运行tmux ls
查看会话列表。
但是,当您通过 启动 tmux 时tmux new -s myproject
,您将看到myproject
输出,而不是数字。因为你在启动 tmux 时指定了会话的名称。
所以,我的解决方案是将一段代码放入~/.bashrc
文件中:
# [tmux] load scripts in ~/.tmux on creating a new pane
# load order: __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
该解决方案的优点是您可以为不同的项目或环境指定不同的脚本。