如何从 .t​​mux.conf 运行 shell 命令

如何从 .t​​mux.conf 运行 shell 命令

如何从 运行 shell 命令.tmux.conf,或者在 tmux 启动时自动运行 shell 命令,而无需点击任何其他命令?

如何创建别名、函数或脚本,例如

tmuxrc -> tmux + irssi

答案1

虽然这似乎不是您想要的,但解决方案是:

如何从 .t​​mux.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

该解决方案的优点是您可以为不同的项目或环境指定不同的脚本。

相关内容