Führen Sie in einer laufenden tmux-Sitzung einen Befehl aus oder senden Sie ihn an einen tmux-Bereich

60

Ich möchte ein Shell-Skript schreiben, das an eine benannte tmux-Sitzung angehängt wird, ein Fenster (oder einen Bereich) in dieser Sitzung auswählen und einen Befehl in diesem ausgewählten Fenster (oder Bereich) ausführen.

Wie mache ich das aus einem Bash-Skript heraus?

ich weiß

tmux new-window -n:mywindow 'exec something'

Ermöglicht mir, Befehle an ein frisch erstelltes Fenster zu senden, aber ich brauche so etwas

tmux select-window -t:0 'my command'

Ich nehme an, ich könnte es verwenden, send-keysaber es scheint, dass es etwas geben sollte, das einen Befehl oder eine Liste von Befehlen benötigt, die ausgeführt werden.

cjroebuck
quelle

Antworten:

82

Jeder TMUX-Bereich ist eine Schnittstelle für eine einzelne Pty (Pseudotty). Nicht geteilte Fenster haben einen einzelnen Bereich. Geteilte Fenster haben mehrere Fenster.

tmux bietet keine Möglichkeit, einem Fenster zusätzliche Prozesse hinzuzufügen, nachdem es mit seinem anfänglichen Befehl gestartet wurde. Es liegt an dem Prozess dieses anfänglichen Befehls (normalerweise eine Shell), die Jobsteuerung 1 für dieses Terminal bereitzustellen.

Wenn Sie das, was gerade im Bereich ausgeführt wird, blockieren möchten, können Sie respawn-pane -kden vorhandenen Befehl beenden und durch einen neuen ersetzen (z respawn-pane -t sessionname:0.4 -k 'some -new command'. B. ).

Wenn Sie jedoch das, was gerade im Bereich ausgeführt wird, beibehalten möchten, gibt es möglicherweise keine bessere Option, als einfach "daran zu tippen" send-keys.

Sie können das Skript folgendermaßen erstellen (zuletzt anhängen, da das Skript ansonsten nur darauf wartet, dass Sie die Verbindung trennen, bevor Sie fortfahren):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

Beachten Sie, dass auf dem send-keysBefehl, sollten Sie die Buchstaben tatsächlich geben E n t e r, zu sagen , tmuxeine neue Zeile Schlüssel zum Fenster zu senden. (Natürlich endet jeder Befehl mit der EnterTaste.)


1 Jobsteuerung ist die Entscheidung zwischen mehreren Prozessgruppen einer einzelnen Sitzung, die das tty als steuerndes Terminal verwendet. Dh die Ctrl+ Zsuspendieren Schlüssel, und die jobs, fgund bgShell - Befehlen.

Chris Johnsen
quelle
2
Danke dafür! Ich habe #{session_name}:#{window_index}.#{pane_index}meine Statuszeile eingegeben, damit ich schnell sehen kann, an welchen Bereich Befehle gesendet werden sollen.
ein bezahlter Nerd
11

Sie können C-manstelle von verwenden Enter. Das ist gleich. Auch tmuxmacht es leicht nach rechts / links Bereich zu senden , indem Sie mit -t rightoder -t left. Wenn Sie einen Bereich in einem anderen Fenster ansprechen möchten, müssen Sie ihm lediglich die Fensternummer und den Punkt voranstellen -t 0.right.

Jetzt können Sie eine einfache Bash-Funktion schreiben, um die Tastenfolge als Argument abzurufen und sie einfach an das Zielfenster zu senden.

Aleksey Gureiev
quelle