Wie kann ich ein Skript schreiben, um mehrere Terminal-Registerkarten zu öffnen und Code darin auszuführen?

Ich möchte in der Lage sein, die Terminalanwendung zu öffnen und entweder automatisch ein Skript auszuführen, das mehrere Registerkarten öffnet und in jeder einen beliebigen Satz von Befehlen ausführt. Zum Beispiel möchte ich, dass eine Registerkarte geöffnet, Verzeichnisse geändert und ein Rails-Server ausgeführt wird. einen anderen öffnen lassen, Verzeichnisse wechseln und eine Protokolldatei auslesen; etc..

Gibt es eine Möglichkeit, dies entweder mit einem Shell-Skript oder Applescript zu tun?

Ich habe diese Frage gefunden, aber sie scheint zu hängen, wenn ich Tabs mit Befehlen öffnen möchte, die nicht enden (wie das Ausführen des Rails-Servers).

Antworten (6)

Das ist ein bisschen hacky, aber Sie können dies in AppleScript erreichen. Wenn Sie eine vorgegebene Anzahl von Registerkarten und voreingestellte Befehle ausführen möchten, ist dies nicht schwierig.

tell application "Terminal"
    -- Activate it.
    activate

    set targetWindow to 0

    -- Get a window that's not busy.
    -- If there are no open windows, open one.
    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 1.
    set firstCommand to "cd ~/Desktop; clear"
    do script firstCommand in targetWindow

    -- Open a new tab.
    tell application "System Events" to tell process "Terminal" to keystroke "t" using command down

    if count of windows is greater than 0 then
        repeat with currentWindow in windows
            if currentWindow is not busy then
                set targetWindow to currentWindow
            end if
        end repeat
    else
        do script ""
        set targetWindow to window 1
    end if

    -- Do command 2.
    set secondCommand to "cd /Applications; clear"
    do script secondCommand in targetWindow

    -- And so on...
end tell

Ersetzen Sie natürlich durch den firstCommandBefehl, den Sie tatsächlich ausführen möchten, und so weiter. Aus irgendeinem Grund hat Terminal keine wirklich zugängliche Möglichkeit, neue Tabs über AppleScript zu erstellen, also weist die lange, hackig aussehende Zeile in der Mitte Terminal nur an T, diesen neuen Tab zu öffnen, und dann werden neue Befehle darin ausgeführt.

Sie können dieses AppleScript so ausführen, wie es ist, oder es in Automator verwenden, um einen neuen Dienst zu erstellen, den Sie dann von überall mit einer Tastenkombination ausführen können, wenn Sie möchten.

Extras - Wenn Sie ein Skript/einen Befehl in der neu geöffneten Terminalsitzung auslösen möchten, können Sie darauf verweisen

Hier ist ein Shell-Skript, das das tut, was Sie wollen - sowohl für Apples Terminal als auch für iTerm (wir haben Benutzer von beiden).

Für Ihre Tabs, die Sie öffnen, wird dadurch eine weitere Batch-Datei in jedem Tab ausgeführt, z. B. eine für Tomcat, eine für Sie db usw.

#!/bin/bash

function tab () {
    local cmd=""
    local cdto="$PWD"
    local args="$@"

    if [ -d "$1" ]; then
        cdto=`cd "$1"; pwd`
        args="${@:2}"
    fi

    if [ -n "$args" ]; then
        cmd="; $args"
    fi

    if [ $TERM_PROGRAM = "Apple_Terminal" ]; then
        osascript 
            -e "tell application \"Terminal\"" \
                -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
                -e "do script \"cd $cdto; clear $cmd\" in front window" \
            -e "end tell"
            > /dev/null
    elif [ $TERM_PROGRAM = "iTerm.app" ]; then
        osascript
            -e "tell application \"iTerm\"" \
                -e "tell current terminal" \
                    -e "launch session \"Default Session\"" \
                    -e "tell the last session" \
                        -e "write text \"cd \"$cdto\"$cmd\"" \
                    -e "end tell" \
                -e "end tell" \
            -e "end tell" \
            > /dev/null
    fi
}

tab path_to_script1 sh script1
tab path_to_script2 sh script2
tab path_to_script3 sh script3

Da es so trivial ist, einen neuen Tab zu öffnen, würde ich vorschlagen, die Ausführung Ihrer Befehle so trivial wie möglich zu gestalten und dies auf die altmodische Weise zu tun.

Sie haben zwei bestimmte Aktionen aufgerufen, also arbeiten wir mit diesen. Beachten Sie, dass ich viele Annahmen treffen werde, die auf meinem Wissen über Rails basieren, aber nicht unbedingt spezifisch für Ihr Projekt sind.

Um es kurz zu machen, aliasieren Sie einen Befehl, um das zu tun, was Sie wollen, oder erstellen Sie ein triviales Shell-Skript, um das zu tun, was Sie wollen.

Erstellen Sie ein Shell-Skript mit dem Namen myapp.start, mit folgendem Inhalt:

#!/bin/bash

cd Development/rails/myapp
# Do any common environment initializations here, such as RAILS_ENV=development
script/server

Sie müssen wahrscheinlich auch eine Datei mit dem Namen .bash_profile in Ihrem Home-Verzeichnis erstellen oder eine bereits vorhandene ändern und eine Zeile hinzufügen wie;

export PATH="$HOME/bin:${PATH}"

Erstellen Sie dann ein bin-Verzeichnis in Ihrem Home-Ordner und verschieben Sie das myapp.start-Skript hinein. Stellen Sie außerdem sicher, dass mindestens das Ausführungsbit des Eigentümers vorhanden ist ( chmod 700 myapp.start).

Öffnen Sie dann Terminal.app, geben Sie ein myapp.start, und Sie haben Schienen am Laufen. Geben Sie alternativ ein und myadrücken TabSie , und lassen Sie den Rest von der Autovervollständigung ausfüllen, drücken Sie return. Bumm, Server läuft.

Als Erweiterung verstehen Sie vielleicht bereits, wie man einen Protokolldatei-Tail erstellt, aber ich werde trotzdem weitermachen. Erstellen Sie eine weitere Datei in ~/bin namens myapp.taillog mit folgendem Inhalt:

#!/bin/bash

tail -F ~/Development/rails/myapp/logs/development.log

Legen Sie es erneut in den Ordner bin, chmod 700 ~/bin/myapp.taillog, drücken Sie nach dem Start des Rails-Servers schnell t, geben myapp.taillogSie ein, und Sie haben eine Protokolldatei, die gedruckt wird.

Zwei Befehle, zwei zusätzliche Keystokes (Öffnen der Tabs), vielleicht reicht das?

Hier gibt es zwei sehr offensichtliche Verbesserungen. Eine besteht darin, eine Shell-Funktion zu schreiben, die in der Lage ist, die Namen von Rails-Apps zu "entdecken", sodass Sie nicht für jede ein Shell-Skript schreiben müssen, das Schreiben eines Unterbefehls zum Starten von Webbrick/Ihrem Rail-Server Ihrer Wahl und Befehle für tail -F'ing routinemäßig ein paar wichtige Protokolldateien.

Die zweite Verbesserung besteht darin, dass Sie wahrscheinlich ein AppleScript schreiben könnten, das die erforderliche Terminalinteraktion und die entsprechende Befehlsausführung in jedem Skript durchführt. Aber ehrlich gesagt, ich scheitere an AppleScript und arbeite den ganzen Tag mit Bash-Code und Perl-Code, also biete ich Ratschläge an, die für meine Fähigkeiten relevant sind :).

Obwohl Sie aufgrund der Formulierung Ihrer Frage möglicherweise an das Apple-Terminal gebunden sind, ist iTerm dem Standard-Terminalemulator zum Skripten und Verwalten mehrerer Fenster überlegen.

Das Konzept der Lesezeichen ermöglicht die einfache Verwaltung einer Reihe von Fenstern. Die Skripterstellung für iTerm mit AppleScript/Automater ist einfacher, leistungsfähiger und auf der Website des Entwicklers besser dokumentiert . (im Vergleich zum Terminal)

Probieren Sie es aus, wenn Sie feststellen, dass das Skripting des normalen Terminals nicht Ihren Anforderungen entspricht. Ich empfehle Ihnen auch dringend, sich mit der Anpassung Ihrer Unix-Shell zu befassen, um Aliase für häufig verwendete Befehle einzurichten. Sie werden sie beim Skripten von anfänglichen Aufgaben für neue Fenster verwenden, aber auch immer dann, wenn Sie sich in einer Shell befinden und Aufgaben wechseln müssen, anstatt ein neues Fenster öffnen zu müssen.

Skripte sind nett und alles, aber Sie könnten Automator auch einfach verwenden, um ein „Watch Me Do“ aufzuzeichnen, bei dem Sie das Terminal öffnen, und ein paar Befehlstaste + N für Ihre bevorzugte Anzahl von Fenstern einwerfen. Et voila.

Es gibt eine großartige Antwort auf eine sehr ähnliche Frage auf StackOverflow, aber sie gehört wahrscheinlich jetzt hierher, also werde ich sie hier einfach kopieren/einfügen.


Dies ist absolut möglich, erfordert jedoch einige Arbeit von Ihrer Seite. Das erste, was Sie tun müssen, ist, jedes gewünschte Fenster/Registerkarte in Ihren Einstellungen einzurichten.

Ich habe 4 Registerkarten, die ich jedes Mal automatisch öffne, wenn ich Terminal öffne. DB Shell, Editor, Server, und Shell. Diese sind alle innerhalb des Sasquatch(nicht fragen) Projekts, daher die Namensgebung. Jedem davon sollte dann ein eindeutiger Befehl zugeordnet sein.

In diesem Fall führe ich aus vim. Wenn Sie zufällig ein bestimmtes Verzeichnis haben, in dem Sie beginnen möchten, können Sie so etwas wie vim ~/projects/main/. Was immer Sie dort eingeben möchten, ist der Befehl, den die Shell beim Öffnen ausführt. Jetzt müssen Sie alle Ihre Fenster/Tabs öffnen:

  1. Schließen Sie alles.
  2. Öffnen Sie für jedes Ihrer Profile ein neues Fenster.
    • Gehen Sie zum ShellMenü => New Tab/ New Window=> Wählen Sie das Profil aus, das Sie oben erstellt haben.
    • Wiederholen Sie dies für jedes gewünschte Fenster oder jede gewünschte Registerkarte.
  3. Wenn Sie alle Fenster und/oder Registerkarten geöffnet haben, speichern Sie sie als Fenstergruppe.
    • Gehen Sie zum WindowMenü => Save Window As Group....
    • Geben Sie Ihrer Fenstergruppe einen Namen (dies ist später hilfreich).
    • Wenn Sie möchten, dass diese Gruppe jedes Mal geöffnet wird, wenn Sie Terminal öffnen, aktivieren Sie das Kontrollkästchen unten auf diesem Bildschirm und klicken Sie dann auf Speichern.
  4. Schließen Sie alle Ihre Fenster/Tabs (Zeit zum Testen!).
  5. Öffnen Sie Ihre neue Fenstergruppe.
    • Gehen Sie zum WindowMenü => Open Window Group=> Wählen Sie die Gruppe aus, die Sie gerade erstellt haben.

Dies sollte alle Fenster, die Sie gerade hatten, an derselben Position öffnen. Jeder der Befehle, die Sie einrichten, Settingssollte in den entsprechenden Registerkarten gestartet werden.

Nur eine Anmerkung, die Links zu Imageshack-Bildern in Ihrer Antwort scheinen defekt zu sein.
Leider habe ich weder die Bilder noch die alte Einstellungsdatei, um sie neu zu erstellen. =-[