単一セッションまたは複数セッションのすべてのウィンドウで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-sendallchmod +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"

関連情報