Tmux - Fenster # jedes Fensters in einem Fenster aus einem Skript abrufen?

12

Gibt es eine Möglichkeit, den Fensterindex eines bestimmten Fensters in Tmux herauszufinden?

Ich weiß, dass ich so etwas ausführen kann wie:

tmux display-message -p  "#{pane_index}"  

Das funktioniert aber nur im aktiven Bereich. Ich möchte, dass es für jeden Bereich funktioniert, in dem es ausgeführt wird. Normalerweise ist es natürlich schwierig, ein Skript in einem Bereich auszuführen, der nicht der aktive Bereich ist. Sie können dies jedoch tun, wenn Sie die :set-window-option synchronize-panesEingabe zwischen allen Fenstern synchronisieren.

Wie würde ich das benutzen?

In meinem Job muss ich gleichzeitig eine Verbindung zu mehreren identischen Servern in einem Load Balancer herstellen, was ich mit Tmux-Fenstern mache. Normalerweise aktiviere ich die Funktion zum Synchronisieren von Fenstern, damit ich alles, was ich tippe, gleichzeitig an jedes Fenster senden kann. Das funktioniert super.

Ich finde, dass ich manchmal eine Verbindung zu den Servern herstellen und für jeden Bereich etwas Einzigartiges tun möchte, wobei ich jedes Mal denselben "Fensterindex" verwende. Zum Beispiel würde ich einen Befehl wie folgt ausführen:

ssh NODE_$(get_pane_number)

Wenn es synchronisiert und in jedem Bereich ausgeführt wird, werden die folgenden Befehle in einem Fenster mit 4 Fenstern ausgeführt:

ssh NODE_0 im Bereich 0

ssh NODE_1 in Bereich 1

ssh NODE_2 in Bereich 2

ssh NODE_3 in Bereich 3

Ich könnte dies natürlich skripten, aber das würde nur gut funktionieren, bevor ich anfing, Eingaben zu synchronisieren. Es gibt Zeiten, in denen ich dies tun möchte, nachdem ich auch mit der Synchronisierung von Eingaben begonnen habe.

Brad Parks
quelle

Antworten:

12

tmux (seit Version 1.5 ) stellt TMUX_PANE in der Umgebung des Prozesses bereit, den es für einen Bereich startet. Jeder neue Bereich erhält einen serverspezifischen Wert. Unter der Annahme, dass TMUX_PANE in Ihrer Umgebung verfügbar ist, sollte dies das tun, was ich denke, dass Sie wollen:

tmux display -pt "${TMUX_PANE:?}" '#{pane_index}'

Die ${…:?}Syntax in einer Bourne-ähnlichen Shell verhindert die Erweiterung fehlender oder leerer Parameter. In diesem Fall würde eine leere Erweiterung auf die Standardeinstellung "Der aktuell aktive Bereich" zurückgreifen, die normalerweise - aber nicht immer - mit "Dieser Bereich" identisch ist (sie unterscheiden sich wahrscheinlich, wenn die tty des Befehls nicht diejenige ist dass tmux gestartet, zB durch Verwendung von Skripts oder erwarten , et cetera).

Chris Johnsen
quelle
Süss! das hat es total geschafft ... sehr geschätzt!
Brad Parks
Die Syntax "$ {TMUX_PANE:?}" Funktioniert nicht in Fischschalen
CodyChan
2

Sie können alle Fensterindizes sowie viele andere Informationen zu den Fenstern mit abrufen

tmux list-panes -a

Unter tmux(1)FORMATE finden Sie eine Liste mit Informationen, mit denen Sie arbeiten können.

ikrabbe
quelle
1
Vielen Dank für das Feedback - aber das sagt mir nicht, welches Fenster welches ist - nur, dass es in einem Fenster Fenster von 0 bis 3 gibt, die ich bereits herausfinden konnte. Ich möchte in der Lage sein, ein Bash-Skript namens zu schreiben get_pane_number, das tatsächlich das richtige # zurückgibt, ohne dass der Bereich aktiv ist.
Brad Parks
2

Aufbauend auf den beiden vorgeschlagenen Lösungen fand ich, dass diese Funktion für mich funktioniert:

I=$(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}')

oder dasselbe beginnend mit index = 1

I=$(($(tmux list-panes -a | grep $TMUX_PANE 2>/dev/null | awk -F: '{print $2}' | awk -F. '{print $2}') + 1))

Es ist nicht das schönste, aber es funktioniert und ich kann es in mein fallen lassen .bashrcund es einfach verwenden, $Iwann immer ich es brauche

Carles Figuerola
quelle