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

8

Ich möchte in der Lage sein, die Terminalanwendung zu öffnen und entweder automatisch ein Skript ausführen zu lassen, das mehrere Registerkarten öffnet, und jeweils einen beliebigen Befehlssatz auszuführen. Zum Beispiel möchte ich, dass eine Registerkarte geöffnet, Verzeichnisse geändert und ein Rails-Server ausgeführt wird. ein anderes öffnen, Verzeichnisse ändern und eine Protokolldatei abschließen; usw..

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

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

Andrew Hubbs
quelle

Antworten:

5

Dies ist ein bisschen hacky, aber Sie können dies in AppleScript erreichen. Wenn es eine vorgegebene Anzahl von Registerkarten gibt, die Sie möchten, und voreingestellte Befehle, die Sie 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 firstCommandSie natürlich durch den Befehl, den Sie tatsächlich ausführen möchten, und so weiter. Aus irgendeinem Grund hat Terminal nicht wirklich die Möglichkeit, neue Registerkarten über AppleScript zu erstellen. Die lange, hackig aussehende Zeile in der Mitte weist Terminal lediglich an, einzugeben T, um diese neue Registerkarte zu öffnen, und dann werden neue Befehle darin ausgeführt.

Sie können dieses AppleScript unverändert ausführen oder in Automator verwenden, um einen neuen Dienst zu erstellen, den Sie dann von überall mithilfe einer Tastenkombination ausführen können, wenn Sie möchten.

Extras - Wenn Sie ein Skript / Befehl in der neu eröffneten Terminal - Sitzung feuern wollen, können Sie beziehen sich diese

Itai Ferber
quelle
2

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

Für Ihre Registerkarten, die Sie öffnen, wird auf jeder Registerkarte eine andere Batchdatei ausgeführt, z. B. eine für Tomcat, eine für Ihre Datenbank 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
bbezanson
quelle
1

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

Sie haben zwei spezifische Aktionen aufgerufen, also lassen Sie uns mit diesen arbeiten. Beachten Sie, dass ich viele Annahmen treffen werde, die auf dem basieren, was ich über Rails weiß, aber nicht unbedingt spezifisch für Ihr Projekt.

Um es kurz zu machen: Aliasen 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 myapp.startmit dem folgenden 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 wie folgt hinzufügen.

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

Erstellen Sie dann ein bin-Verzeichnis in Ihrem Home-Ordner und verschieben Sie das Skript myapp.start hinein. Stellen Sie außerdem sicher, dass der Eigentümer mindestens ein Bit ausführt ( chmod 700 myapp.start).

Öffnen Sie dann Terminal.app, geben myapp.startSie ein und Sie haben Rails ausgeführt. Alternativ geben Sie ein, myadrücken Sie Tabund lassen Sie die automatische Vervollständigung den Rest füllen. Drücken Sie return. Boom, Server läuft.

Im weiteren Sinne verstehen Sie vielleicht bereits, wie man eine Protokolldatei erstellt, aber ich werde trotzdem fortfahren. Erstellen Sie in ~ / bin eine weitere Datei mit dem Namen myapp.taillog mit dem Inhalt:

#!/bin/bash

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

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

Zwei Befehle, zwei zusätzliche Tastenanschläge (Öffnen der Registerkarten), vielleicht reicht das aus?

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 jedes ein Shell-Skript schreiben müssen, sondern einen Unterbefehl schreiben müssen, mit dem Webbrick / der Rails-Server Ihrer Wahl gestartet werden soll, und Befehle zum Tail-Routing einiger Schlüsselprotokolldateien routinemäßig.

Die zweite Verbesserung besteht darin, dass Sie wahrscheinlich ein AppleScript schreiben können, das die erforderliche Terminalinteraktion und die entsprechende Befehlsausführung in jedem einzelnen ausführt. Aber ehrlich gesagt, ich mag 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 :).

Jason Salaz
quelle
1

Obwohl Sie aufgrund des Wortlauts Ihrer Frage möglicherweise an das Apple-Terminal gebunden sind, ist iTerm dem Standard-Terminalemulator für die Skripterstellung und Verwaltung mehrerer Fenster überlegen.

Das Konzept der Lesezeichen ermöglicht die einfache Verwaltung einer Reihe von Fenstern. Das Erstellen von Skripten 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 Skript eines normalen Terminals nicht Ihren Anforderungen entspricht. Ich empfehle Ihnen außerdem dringend, Ihre Unix-Shell so anzupassen, dass Aliase für häufig verwendete Befehle eingerichtet werden. Sie werden sie zum Erstellen von Skripten für anfängliche 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.

bmike
quelle
1

Skripte sind nett und alle, aber Sie können auch einfach Automator verwenden, um ein "Watch Me Do" aufzuzeichnen, bei dem Sie das Terminal öffnen, und ein paar Command + Ns für Ihre bevorzugte Anzahl von Fenstern eingeben. Et voila.

David Metcalfe
quelle
1

Es gibt eine großartige Antwort auf eine sehr ähnliche Frage bei StackOverflow, aber sie gehört wahrscheinlich jetzt hierher, also kopiere ich sie einfach hier hinein.


Dies ist absolut möglich, erfordert jedoch einige Arbeiten von Ihrer Seite. Als erstes müssen Sie jedes Fenster / jede Registerkarte einrichten, die Sie in Ihren Einstellungen haben möchten.

Ich habe 4 Registerkarten, die ich jedes Mal automatisch öffne, wenn ich Terminal öffne. DB Shell, Editor, Server, Und Shell. Diese befinden sich alle innerhalb des Sasquatch(nicht fragen) Projekts, also der Benennung. Jedem dieser Befehle 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 verwenden vim ~/projects/main/. Was auch immer Sie dort hineingehen möchten, ist der Befehl, den die Shell beim Öffnen ausführt. Jetzt müssen Sie alle Ihre Fenster / Registerkarten öffnen:

  1. Alles schließen.
  2. Öffnen Sie für jedes Ihrer Profile ein neues Fenster.
    • Gehen Sie zum ShellMenü => New Tab/ New Window=> Wählen Sie das oben erstellte Profil aus.
    • Wiederholen Sie diesen Vorgang 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 diese Gruppe bei jedem Öffnen des Terminals geöffnet werden soll, aktivieren Sie das Kontrollkästchen am unteren Rand dieses Bildschirms und klicken Sie dann auf Speichern.
  4. Schließen Sie alle Windows / Tabs (Zeit zum Testen!).
  5. Öffnen Sie Ihre neue Fenstergruppe.
    • Gehen Sie zum WindowMenü => Open Window Group=> Wählen Sie die gerade erstellte Gruppe aus.

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

Jack M.
quelle
1
Nur eine Anmerkung, die Imageshack-Bildlinks in Ihrer Antwort scheinen defekt zu sein.
Beporter
Leider habe ich weder die Bilder noch die alte Einstellungsdatei, um sie neu zu erstellen. = - [
Jack M.