假設以下場景。我有一些命名的機器,我想透過它們在一個窗格中連接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
問題很少。
為了
$(foo)
工作foo
應該將所需的資訊列印到其標準輸出。tmux run …
不這樣做;它顯示複製模式下的結果。你要tmux display -p …
。tmux display -p '#{pane_index}'
當您逐一窗格呼叫命令窗格時,可以為您提供有用的數字,但在同步窗格中,輸出將是相同的。這是因為,如果您未指定窗格(使用-t
),則假定目前活動窗格。當您逐一窗格呼叫時,每次正確的窗格處於作用中狀態。當您在同步窗格中呼叫時,只有一個窗格處於活動狀態,並且所有命令都會傳回其索引。若要可靠地識別命令運行所在的窗格,請使用
$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 命令。