如何在单个或多个会话中跨所有窗格运行 Tmux 命令?

如何在单个或多个会话中跨所有窗格运行 Tmux 命令?

有时我想在单个或多个会话中的所有窗格中运行 Tmux 命令,例如清理我的工作环境。

一个例子是执行这个 Tmux 命令:

# Clear screen
bind M-l send-keys -R \; clear-history \; send-keys C-l \; display "█▓░ clear"

我知道synchronize-panes窗口选项,但据我所知,它仅同步当前窗口中的窗格,而不是所有会话中的所有窗格:

# Synchronize panes (toggle option)
bind C-s setw synchronize-panes \; display "█▓░ synchronize (#{?synchronize-panes,on,off})"

有没有办法在单个会话或多个会话中的所有窗格中运行 Tmux 命令?

答案1

这是我为此编写的脚本。保存为tmux-sendall( chmod +x tmux-sendall):

#!/bin/bash

if [[ -z $1 ]]; then
    current=$(tmux display -p "#S")
    echo "usage: tmux-sendall SESSION [COMMAND]"
    if [[ -n $current ]]; then
        echo "current session: $current"
    fi
    exit 1
else
    session="$1"
fi

if [[ -n $2 ]]; then
    message="$2"
else
    read -p "send cmd to session $session$ " message
    if [[ -z $message ]]; then exit 1; fi
fi

function sendwindow() {
    # $1=target, $2=command
    tmux setw -t $1 synchronize-panes
    tmux send-keys -lt "$1" "$2"
    tmux send-keys -t "$1" "Enter"
    tmux setw -t $1 synchronize-panes off
}

export -f sendwindow
tmux list-windows -t $session | cut -d: -f1 | xargs -I{} bash -c "sendwindow '$session:{}' '$message'"

它列出给定会话的窗口,然后sendwindow为每个窗口执行该函数。

sendwindow如果您希望它执行其他操作,您可以使用 tmux 命令自定义该函数。

例如,假设您有一个名为 的会话1

tmux-sendall 1 "echo hello world"

相关内容