次のシナリオを想定します。host1
から という名前のマシンがありhost4
、それぞれ 1 つのペインに接続したいと考えています。
Tmux ウィンドウを 4 つのペインに均等に分割し、各ペインでそれらのホストへの SSH 接続をホストできるようにしました。
すでに接続されていて、ペインが同期されている場合はすべて正常です。すべてのホストで同時に実行されるコマンドを発行できます。
しかし、今は、各ホストに次のコマンドを発行して接続できれば非常に便利だと考えています。まったく同じコマンドこうすることで、ホストに接続する前でもペイン間の同期を有効にすることができます。
残念ながら、うまくいく方法を思いつくことができません。私が試したのはこれです:
ssh root@host$(tmux run "echo '#{pane_index}'")
ここでの考え方は、コマンドが実行されるペインに応じて、これをssh root@host1
throughに解決する必要があるということです。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
)、現在アクティブなペインが想定されるためです。ペインごとに呼び出すと、適切なペインが常にアクティブになります。同期ペインで呼び出すと、正確に 1 つのペインがアクティブになり、そのインデックスがすべてのコマンドによって返されます。コマンドが実行されるペインを確実に識別するには、
$TMUX_PANE
環境変数を使用します。この場合、これを直接行うことはできません。# flawed ssh root@host"${TMUX_PANE#%}"
問題
$TMUX_PANE
は に対応しており#{pane_id}
、 には対応していません#{pane_index}
。ペイン ID は tmux サーバー全体で一意です。作成された最初の 4 つのペインに対して、、、、 が返されます。問題%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が各ペインのコマンドの環境に配置する変数を使用できます$TMUX_PANE
。たとえば、コマンド
tmux send-keys 'echo host${TMUX_PANE#%}' Enter
host0
各ペインに、host1
、 などが表示されます。そのため、 echo を ssh コマンドに置き換えます。