如何取得具有同步窗格的視窗中每個窗格的索引?

如何取得具有同步窗格的視窗中每個窗格的索引?

假設以下場景。我有一些命名的機器,我想透過它們在一個窗格中連接host1host4

我已將 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,等等。因此,將 echo 替換為 ssh 命令。

相關內容