有时我想在单个或多个会话中的所有窗格中运行 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"