An tmux-Sitzung anhängen und einen Befehl ausführen


6

Wie kann ich einen Befehl in Tmux ausführen, wenn ich eine Verbindung zu einer Sitzung herstelle?

Ich möchte anhängen und sofort einen Befehl ausführen.

Ich habe die Dokumente gelesen, aber nur Sendeschlüssel gefunden, die nicht meinen Anforderungen entsprechen.


Ich frage mich, was Sie erwarten, wenn beispielsweise die von Ihnen angehängte tmux-Sitzung ausgeführt wird vi.
Falcon Momot

Es wird nur die bash laufen
astropanic

Antworten:


9

Sie können eine Verbindung zu einer laufenden tmux-Sitzung herstellen und ein neues Fenster öffnen, in dem ein bestimmter Befehl ausgeführt wird:

tmux attach \; new-window vim

Beachten Sie, dass dies nicht zu vim im Fenster vor dem Beenden führt - es gibt keine Möglichkeit, dies zu tun, es ist nicht wirklich sinnvoll: Wie @Falcon Momot betont, kann in einem vorhandenen Fenster alles ausgeführt werden, die einzige Möglichkeit, dies zu tun Befehle ist "Schlüssel senden".


3
Gute Antwort! Dies muss für die meisten Leser offensichtlich sein, aber es hat eine Weile gedauert, bis ich es erkannt habe. Für den Fall, dass jemand die gleiche Frage hat: Das \;ist ein Escape-Semikolon, das hier verwendet wird, um zwei tmuxBefehle zu trennen (ohne das Semikolon new-windowszu maskieren , wird als behandelt ein neuer Shell-Befehl).
Joe

3

Probieren Sie dies aus, um beispielsweise mutt auszuführen

tmux has-session -t mail
if [ $? != 0 ]
then
tmux new-session -s mail -n mel_GMAIL -d "TERM=xterm-256color ; mutt -F $HOME/.mutt/muttrc_perso"
fi
lxterminal --command="tmux attach -t mail"

Es überprüft das Vorhandensein einer 'Mail'-Sitzung, die ausgeführt wird. Wenn nicht, erstellt es eine und startet den Anwendungs-Mutt. schließlich hängt es daran


3

Ich suchte nach einer Lösung für genau dieses Problem. Dies kann mit den Befehlen 'set-buffer' und 'paste-buffer' erfolgen

tmux att -t <session-name> \; set-buffer "<command>^M" \; paste-buffer

Hier ist ein vollständiges Beispiel:

# let's start with two sessions running bash
tmux new -s theOtherSession \; detach
tmux new -s astropanic \; rename-window main-window \; detach

# attach to the 'astropanic' session, run a directory listing, output
# current datetime, then detach. Note for carriage return (^M) type ^V^M
tmux att -t astropanic \; find-window main-window \; set-buffer "ls;date^M" \; paste-buffer \; detach

# reconnect to check status
tmux att -t astropanic

1
Ich habe es nicht geschafft, das zu tun, carriage returnwas du gesagt hast. Ich musste die Eingabetaste wie folgt senden : tmux attach -t "$1" \; set-buffer "ls;date" \; paste-buffer \; send-keys C-m.
Alex Palcuie

1
Dies sollte die akzeptierte Antwort sein. Grundsätzlich sollten Sie ein Fenster benennen und den Namen durch Hinzufügen DISABLE_AUTO_TITLE="true"zu Ihrem Shell-Profil beibehalten (dies ist wichtig). Verwenden Sie dieses Fenster dann nur, um Befehle beim Verbinden auszuführen. Ich verwende es, um eine Verbindung zu einem SSH-Host herzustellen und dann zu Beginn des Tages mein Kerberos-Ticket zu erhalten. ssh hostname -t "tmux a -t 0 \; select-window -t cmd \; set-buffer \"kinit -f -l 1d -r 30d^M\" \; paste-buffer \;". Geben Sie ihm der Einfachheit halber einen schönen Namen und speichern Sie ihn als Skript in Ihrem Pfad. :) Beachten Sie auch, dass ^ M eingefügt werden sollte, indem Sie Cv und dann Enter in Ihrem Editor drücken.
Gaurav

2

Mir ist nicht klar, welche Art von Befehl Sie ausführen möchten, einen tmux-Befehl oder einen Shell / OS-Befehl. Hier ist jeweils ein Beispiel:

#!/bin/bash

cd

# give the session a name; makes it easier to reuse code lines
_SNAME=Generic

# start a whole new tmux session
tmux new-session -s $_SNAME -d -x 140 -y 35

# can set tmux options
tmux set-option -t $_SNAME default-path /opt/foo/build

# create a new window that's just a shell
tmux new-window -t $_SNAME -n build -d

# create a new window that's running a program
tmux new-window -t $_SNAME -n vim -d vim

Dadurch bleibt die Sitzung nicht verbunden. Wenn Sie auch daran anhängen möchten, fügen Sie diese Zeile am Ende des Shell-Skripts hinzu:

# attach to the new session
tmux attach -t $_SNAME

1

Hier ist ein kleines Skript, das Tmux startet oder an Tmux anfügt und einen Befehl darin ausführt. Sobald der Befehl ausgeführt wurde, wird Tmux beendet.

#!/bin/sh -x
SESSION_NAME=foo

tmux has-session -t $SESSION_NAME 2>/dev/null
if [ $? -ne 0 ]
then
  tmux new-session -d -s $SESSION_NAME "$*"
fi
exec tmux attach -t $SESSION_NAME

Anwendungsbeispiel:

$ ./script-above 'echo hello world && sleep 10'

0

Ich mache das gerne:

#!/bin/bash

function tmuxed {
    /usr/local/bin/tmux new-session -d -s bkp 2&>/dev/null
    /usr/local/bin/tmux send-keys "/Users/xxx/bin/thisscript backup" C-m
}

function backup {
    echo 'bla bla doing stuff'
}

$1

Und Renn /Users/xxx/bin/thisscript tmuxed

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.