Wie erhält man den Index jedes Bereichs in einem Fenster mit synchronisierten Bereichen?

Wie erhält man den Index jedes Bereichs in einem Fenster mit synchronisierten Bereichen?

Stellen Sie sich folgendes Szenario vor: Ich habe die Maschinen, mit host1denen host4ich mich verbinden möchte, in jeweils einem Bereich aufgelistet.

Ich habe mein Tmux-Fenster gleichmäßig in vier Bereiche aufgeteilt, sodass jeder von ihnen eine SSH-Verbindung zu diesen Hosts hosten kann.

Wenn die Verbindung bereits besteht und die Fenster synchronisiert sind, funktioniert alles einwandfrei. Ich kann Befehle ausgeben, die auf allen Hosts gleichzeitig ausgeführt werden.

Jetzt dachte ich mir jedoch, dass es ganz nett wäre, mit jedem Host eine Verbindung herstellen zu können, indem man denexakt der gleiche Befehl. Auf diese Weise konnte ich die Synchronisierung zwischen den Fenstern aktivieren, noch bevor ich eine Verbindung zu diesen Hosts herstellte.

Leider fällt mir keine Methode ein, die funktioniert. Ich habe Folgendes versucht:

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

Die Idee dahinter ist, dass dies abhängig vom Bereich, in dem der Befehl ausgeführt wird, ssh root@host1aufgelöst werden sollte.ssh root@host4

Leider war das Ergebnis ziemlich unerwartet. Obwohl der Befehl ausgeführt wurde (während Fenster 1 aktiv war), wurden alle Verbindungen zu hergestellt host1. Offensichtlich pane_indexbezieht sich diese Variable also auf das aktuell aktive Fenster und nicht auf das Fenster, in dem der Befehl ausgegeben wird.

Wie kann ich eine Verbindung herstellen, host1indem host4ich den Fensterindex (oder etwas anderes) verwende, indem ich denexakt der gleiche Befehlin jedem Bereich, anstatt einzelne Befehle eingeben zu müssen?

NB: Alle Indizes beginnen bei 1, aber dies könnte natürlich auch funktionieren, wenn dies nicht der Fall wäre, z. B. mithilfe von $((...))in Bash.

Antwort1

Es gibt nur wenige Probleme.

  1. Damit $(foo)es funktioniert, foosollten die gewünschten Informationen auf die Standardausgabe gedruckt werden. tmux run …tut dies nicht; eszeigtdas Ergebnis im Kopiermodus. Sie möchten tmux display -p ….

  2. tmux display -p '#{pane_index}'kann Ihnen nützliche Zahlen liefern, wenn Sie den Befehl Bereich für Bereich aufrufen, aber in synchronisierten Bereichen ist die Ausgabe identisch. Dies liegt daran, dass, wenn Sie keinen Bereich angeben (mit -t), der aktuell aktive Bereich angenommen wird. Wenn Sie Bereich für Bereich aufrufen, ist jedes Mal der richtige Bereich aktiv. Wenn Sie in synchronisierten Bereichen aufrufen, ist genau ein Bereich aktiv und sein Index wird von allen Befehlen zurückgegeben.

  3. Um den Bereich, in dem ein Befehl ausgeführt wird, zuverlässig zu identifizieren, verwenden Sie die $TMUX_PANEUmgebungsvariable. In Ihrem Fall können Sie dies nicht direkt tun.

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

    Das Problem ist, dass $TMUX_PANEes mit übereinstimmt #{pane_id}, nicht mit #{pane_index}. Die Fenster-IDs sind auf dem gesamten tmux-Server eindeutig. Sie erhalten %0, %1, %2, %3für die ersten vier erstellten Fenster. Die betreffenden Fenster können Ihnen auch %7, %8, %13, %14, geben, wenn früher und in der Zwischenzeit andere Fenster erstellt wurden.

    Der richtige Weg besteht darin, $TMUX_PANEeinen Bereich anzugeben und #{pane_index}die gewünschte Nummer abzurufen.

Lösung:

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

Es generiert host0…, host3aber es sieht so aus, als wüssten Sie, was zu tun ist, um host1… zu erhalten host4. Ich habe beschlossen, die Lösung nicht mit zu verschleiern $((…)).

Antwort2

Sie können die Variable verwenden $TMUX_PANE, die tmux in der Umgebung des Befehls jedes Fensters platziert. Wenn Sie beispielsweise den Befehl

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

Sie sehen in jedem Bereich host0, oder host1, usw. Ersetzen Sie also echo durch Ihren SSH-Befehl.

verwandte Informationen