Führen Sie beim Starten von tmux optional mehrere Befehle aus


7

Ich habe eine ~/.tmux/devDatei, die so aussieht:

selectp -t 0    # select the first pane
splitw -h -p 50 # split it into two halves

selectp -t 1    # select the new, second (1) pane
splitw -v -p 50 # split it into two halves

selectp -t 0    # go back to the first pane
send-keys 'vim .' Enter

Wenn ich tmux source-file ~/.tmux/devaus einer tmux-Sitzung heraus laufe, funktioniert es einwandfrei.

Ich möchte ein Bash-Skript erstellen, das tmux öffnet und diese Befehle automatisch ausführt.

Ich habe versucht zu rennen

tmux new 'tmux source-file ~/.tmux/dev'

aber ich sehe nur zwei Scheiben; Die Scheibe mit Vim fehlt.

Ich habe gelesen Wie kann ich tmux dazu bringen, eine Reihe von Fenstern zu öffnen, ohne sie manuell einzugeben? , aber bevor ich ein Tool zum Verwalten von tmux-Konfigurationen installiere, möchte ich herausfinden, was hier passiert.

Vielen Dank im Voraus für jedes Licht, das Sie auf das Thema werfen können.

Antworten:


6

Folgendes passiert:

  1. tmux new 'tmux source-file ~/.tmux/dev'

    Die newBefehle erstellen eine neue Sitzung mit einem einzelnen Fenster mit einem einzelnen Bereich. Der Befehl wird tmux source-file ~/.tmux/devin diesem neuen Bereich ausgeführt.

    • Sie haben also eine neue Sitzung N(wobei N eine Zahl ist) mit
    • ein einzelnes Fenster N:0(oder was auch immer Sie eingestellt haben base-index), mit
    • ein einzelnes Fenster N:0.0(oder was auch immer Sie eingestellt haben base-pane-index),
    • Ausführen des Befehls tmux source-file ~/.tmux/dev.
  2. Der source-fileBefehl wird verarbeitet.

    1. Die zusätzlichen Scheiben werden hinzugefügt.
    2. Bereich 0 wird (erneut) ausgewählt.
    3. Der send-keysBefehl "tippt" dann vim .+ Eingabe in Bereich 0.
      Diese Eingabe wird ignoriert, da in diesem Bereich nur der tmux- Client ausgeführt wird, der den source-fileBefehl gesendet hat .
  3. Der tmux- Client wird beendet und schließt den Bereich 0.

Das unerwartete Bit ist also, dass im Bereich 0 (dh N:0.0) (nur) der source-fileBefehl ausgeführt wird, der Ihren "getippten" Befehl ignoriert. In diesem Bereich wird niemals eine interaktive Shell ausgeführt, die den Befehl "typisiert" interpretieren könnte.

Es gibt mindestens einige Möglichkeiten, wie Sie dies beheben können:

  • Beginnen Sie ~/.tmux/devmit , new-windowso dass die Scheibe 0 Ihren „Standardbefehl“ (dh wahrscheinlich eine interaktive Shell) ausgeführt wird .

    Diese Methode hat den Vorteil, dass nicht davon ausgegangen wird, dass in Ihrem aktuellen Bereich eine interaktive Shell ausgeführt wird, und dass nicht davon ausgegangen wird, dass der aktuelle Bereich ausgeführt wird 0(dh was passiert, wenn Sie Ihre ursprüngliche Befehlsreihe für einen Bereich ausführen, der Teil eines bereits geteilten Fensters ist ?). Dies bedeutet, dass Sie sicher source-file ~/.tmux/devan einen Schlüssel binden können , den Sie in jedem Kontext ausführen können (da ein neues Fenster für alle Bereiche erstellt wird). Über die Shell können Sie entweder tmux source-file ~/.tmux/dev(um ein neues Fenster in der aktuellen Sitzung tmux new 'tmux source-file ~/.tmux/dev'zu erstellen ) oder Ihr Original ausführen , um eine neue Sitzung zu erstellen.

    Ein kleiner Nachteil dieser Methode ist, dass beim Ausführen tmux new 'tmux source-file ~/.tmux/dev'des Startfensters immer noch der Client ausgeführt wird, der source-filerelativ schnell sendet und beendet. Dies bedeutet, dass Ihr „Hauptfenster“ (das mit den Teilungen) höher ist als Ihr base-indexund ein zukünftiges neues Fenster vor dem „Hauptfenster“ platziert wird. Sie können dies beheben, indem Sie Folgendes verwenden:

    tmux new 'tmux move-window -t 99 \; source-file ~/.tmux/dev'
    

    Es verschiebt das (kurzlebige) Anfangsfenster auf einen hohen Index, so dass das new-windowIn ~/.tmux/devbei endet base-index.

  • Verwenden Sie (z. B.), tmux new 'tmux source-file ~/.tmux/dev ; zsh -l'damit im Bereich nach Abschluss des source-fileBefehls eine interaktive Shell ausgeführt wird .

    Das Hässliche daran ist, dass Sie am Ende Ihre bevorzugte Shell in diesen Befehl „hart codieren“. Außerdem wird die send-keysEingabe ( vim .+ Eingabetaste) technisch gesendet, bevor die Shell gestartet wird. Dies ist wahrscheinlich in Ordnung, aber möglicherweise nicht immer vollständig zuverlässig.

    Sie könnten vermeiden, Ihre Shell hart zu codieren, indem Sie tmux nach dem abfragen default-command(oder wenn dies nicht festgelegt ist default-shell(oder wenn dies nicht festgelegt ist, mit SHELL)), aber das kann mehr Arbeit sein, als Sie wirklich wollen.


0

Ich könnte ein ähnliches Problem folgendermaßen umgehen:

#!/bin/bash

tmp=$(mktemp --tmpdir=/tmp/).tmux

cleanup () {
        rm -f "$tmp"
}
trap cleanup EXIT

dump_cmd () {
        local i=$1
        shift
        echo "tcpdump -i $i -s 1500 \"port 67 or port 68\" -e $@"
}

cat <<-EOT > "$tmp"
        new-window
        send-keys '$(dump_cmd eno1)' Enter
        splitw -v -p 50
        send-keys '$(dump_cmd enp12s0f2)' Enter
EOT

tmux new 'tmux move-window -t 99 \; source-file '"$tmp"

# EOF #

Dieses Skript startet zwei Sniffer an zwei Schnittstellen in zwei Fenstern.

PS

Man kann einfach verwenden

        new-window '$(dump_cmd eno1)'
        splitw -v -p 50 '$(dump_cmd enp12s0f2)'

anstelle dieser vier Zeilen, aber ^Cum diesen Bereich tcpdumpauch zu töten. Dies ist möglicherweise nicht das, was Sie wollen.

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.