如何获取具有同步窗格的窗口中每个窗格的索引?

如何获取具有同步窗格的窗口中每个窗格的索引?

假设以下场景。我在一个窗格中命名了每台机器,并希望host1通过这些机器进行连接。host4

我把 Tmux 窗口均匀地分成四个窗格,以便每个窗格都可以托管到这些主机的 SSH 连接。

连接成功并且窗格同步后,一切正常。我可以发出命令,同时在所有主机上执行。

但是,现在我在想,如果能够通过发出以下命令连接到每个主机,那就太好了完全相同的命令。这样,我甚至可以在连接到这些主机之前启用窗格之间的同步。

唉,我没法想出一个可行的方法。我试过以下方法:

ssh root@host$(tmux run "echo '#{pane_index}'")

这里的想法是,这应该根据运行命令的窗格ssh root@host1来解决。ssh root@host4

不幸的是,结果出乎意料。尽管命令已执行(当窗格 1 处于活动状态时),但所有连接都已建立host1。因此显然该变量pane_index指的是当前活动的窗格,而不是发出命令的窗格。

我如何才能host1通过host4利用窗格索引(或其他内容)通过发出完全相同的命令在每个窗格中,而不必键入单独的命令?

注意:所有索引都从 1 开始,但即使情况并非如此,当然也可以使其工作,例如通过$((...))Bash。

答案1

问题很少。

  1. 为了$(foo)工作,foo应该将所需的信息打印到其标准输出。tmux run …不这样做;它显示器复制模式下的结果。你想要的tmux display -p …

  2. tmux display -p '#{pane_index}'当您逐个窗格调用命令时,可以为您提供有用的数字,但在同步窗格中,输出将相同。这是因为如果您不指定窗格(使用-t),则假定当前活动窗格。当您逐个窗格调用时,每次都会激活适当的窗格。当您在同步窗格中调用时,只有一个窗格处于活动状态,并且所有命令都将返回其索引。

  3. 要可靠地识别命令运行的窗格,请使用$TMUX_PANE环境变量。对于您的情况,您不能直接执行此操作。

    # flawed
    ssh root@host"${TMUX_PANE#%}"
    

    问题是$TMUX_PANE对应于#{pane_id},而不是#{pane_index}。窗格 ID 在整个 tmux 服务器中都是唯一的。对于创建的前四个窗格,您将获得%0%1%2。如果其他窗格是在此之前创建的,则相关窗格也可能为您提供、、、 。%3%7%8%13%14

    正确的方法是使用$TMUX_PANE指定窗格并#{pane_index}检索所需的数字。

解决方案:

ssh root@host"$(tmux display -p -t "$TMUX_PANE" '#{pane_index}')"

它生成了host0..host3但看起来你知道该怎么做才能得到host1..host4我决定不用 来混淆解决方案$((…))

答案2

$TMUX_PANE您可以使用tmux 在每个窗格的命令环境中放置的变量。例如,如果您给出命令

tmux send-keys  'echo host${TMUX_PANE#%}' Enter

您将在每个窗格中看到host0、 或host1等等。因此,请用您的 ssh 命令替换 echo。

相关内容