Come posso scrivere uno script per aprire più schede terminali ed eseguire il codice in esse?


8

Voglio essere in grado di aprire l'applicazione terminale e farla eseguire automaticamente uno script che apre diverse schede ed esegue una serie arbitraria di comandi in ciascuna. Ad esempio, vorrei aprire una scheda, cambiare directory ed eseguire un server rails; avere un altro aperto, cambiare directory e mettere in coda un file di registro; eccetera..

C'è un modo per farlo o con uno script di shell o un programma di mele?

Ho trovato questa domanda, ma sembra bloccarsi se voglio aprire le schede con comandi che non finiscono (come eseguire il server rails).

Risposte:


5

Questo è un po 'confuso, ma puoi farlo in AppleScript. Se c'è un numero predeterminato di schede che desideri e comandi preimpostati che desideri eseguire, questo non è difficile.

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

Naturalmente, sostituiscilo firstCommandcon qualsiasi comando tu voglia effettivamente eseguire, e così via. Per qualsiasi motivo, Terminal non ha davvero un modo accessibile per creare nuove schede tramite AppleScript, quindi la lunga e frastagliata linea nel mezzo dice a Terminal di digitare Tper aprire quella nuova scheda, e quindi i nuovi comandi verranno eseguiti in essa.

Puoi eseguire questo AppleScript così com'è o utilizzarlo in Automator per creare un nuovo servizio, che puoi eseguire da qualsiasi luogo utilizzando una scorciatoia da tastiera, se lo desideri.

Extra: se si desidera attivare alcuni script / comandi nella sessione terminale appena aperta, è possibile fare riferimento a questo


2

Ecco uno script di shell che farà ciò che desideri, sia per il terminale Apple che per iTerm (abbiamo utenti di entrambi).

Per le tue schede che apri, questo eseguirà un altro file batch in ciascuna scheda, come uno per Tomcat, uno per te db, ecc.

#!/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

1

Dal momento che è così banale aprire una nuova scheda, suggerirei di rendere l'esecuzione dei comandi il più banale possibile, e di farlo alla vecchia maniera.

Hai chiamato due azioni specifiche, quindi lavoriamo con quelle. Nota che farò molte ipotesi basate su ciò che so di Rails, ma non necessariamente specifico per il tuo progetto.

Per farla breve, alias un comando per fare anche quello che vuoi, o creare un banale script di shell per fare quello che vuoi.

Crea uno script shell chiamato myapp.start, con il contenuto:

#!/bin/bash

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

Probabilmente dovrai anche creare un file chiamato .bash_profile nella tua home directory, o modificarne uno già esistente e aggiungere una riga come;

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

Quindi, crea una directory bin nella cartella home e sposta lo script myapp.start in essa. Assicurarsi inoltre che il proprietario esegua il bit almeno ( chmod 700 myapp.start).

Quindi, apri Terminal.app, digita myapp.starte hai i binari in esecuzione. In alternativa, digitare myaquindi premere Tabe lasciare che il completamento automatico riempia il resto, premere return. Boom, server in esecuzione.

Per estensione, potresti già capire come fare la coda di un file di registro, ma continuerò comunque. Crea un altro file in ~ / bin chiamato myapp.taillog, con il contenuto:

#!/bin/bash

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

Ancora una volta, posizionalo nella cartella bin chmod 700 ~/bin/myapp.taillog, quindi dopo aver avviato il server rails, premi rapidamente t, digita myapp.tailloge avrai un file di registro in fase di stampa.

Due comandi, due tasti aggiuntivi (apertura delle schede), forse è sufficiente?

Ci sono due miglioramenti molto evidenti qui. Uno è scrivere una funzione di shell in grado di "scoprire" i nomi delle app di rails, quindi non è necessario scrivere uno script di shell per ciascuno, scrivere un sotto-comando progettato per avviare webbrick / il server di rails di propria scelta, e comandi per tail -F'ing di routine alcuni file di log chiave.

Il secondo miglioramento è che è probabile che tu possa scrivere un AppleScript che esegue l'interazione terminale necessaria e l'esecuzione appropriata dei comandi all'interno di ciascuno. Ma francamente, faccio schifo con AppleScript e lavoro in codice bash e codice perl tutto il giorno, quindi sto offrendo consigli pertinenti al mio set di abilità :).


1

Anche se potresti essere legato al terminale Apple in base al testo della tua domanda, iTerm è superiore all'emulatore di terminale predefinito per lo scripting e la gestione di più finestre.

Il concetto di segnalibri consente una facile gestione di un set di finestre. Lo scripting di iTerm tramite AppleScript / Automater è più semplice, più potente e meglio documentato sul sito Web dello sviluppatore . (rispetto al terminale)

Dai un'occhiata se trovi che lo script del terminale normale non soddisfa le tue esigenze. Consiglio vivamente anche di cercare di personalizzare la shell unix per impostare gli alias per i comandi utilizzati di frequente. Li userete nelle attività iniziali di scripting per nuove finestre, ma anche ogni volta che vi trovate in una shell e dovete cambiare attività piuttosto che dover aprire una nuova finestra.


1

Gli script sono belli e tutti, ma puoi anche usare Automator per registrare un 'Watch Me Do' in cui apri Terminal e lanciare alcuni Command + N per il tuo numero di finestre preferito. Et voilà.


1

C'è una grande risposta a una domanda molto simile su StackOverflow, ma probabilmente ora appartiene qui, quindi lo copierò / incollerò qui.


Questo è assolutamente possibile, ma ci vorrà del lavoro da parte tua. La prima cosa che ti serve è impostare ogni finestra / scheda che desideri nelle tue Impostazioni.

Ho 4 schede che apro automagicamente ogni volta che apro Terminal. DB Shell, Editor, Server, E Shell. Questi sono tutti all'interno del progetto Sasquatch(non chiedere), quindi la denominazione. Ognuno di questi dovrebbe quindi avere un comando unico associato ad essi.

In questo caso, sto eseguendo vim. Se ti capita di avere una directory specifica da cui iniziare, puoi usare qualcosa del genere vim ~/projects/main/. In realtà qualunque cosa tu voglia andare lì è il comando che la shell eseguirà quando si apre. Ora devi aprire tutte le finestre / schede:

  1. Chiudi tutto.
  2. Apri una nuova finestra per ciascuno dei tuoi profili.
    • Vai al Shellmenu => New Tab/ New Window=> Seleziona il profilo che hai creato sopra.
    • Ripeti l'operazione per ogni finestra o scheda che desideri.
  3. Dopo aver aperto tutte le finestre e / o le schede, salvarle come gruppo di finestre.
    • Vai al Windowmenu => Save Window As Group....
    • Dai un nome al tuo gruppo di finestre (utile in seguito).
    • Se si desidera che questo gruppo si apra ogni volta che si apre Terminale, selezionare la casella nella parte inferiore di questa schermata, quindi premere Salva.
  4. Chiudi tutte le finestre / schede (è il momento di testarlo!).
  5. Apri il tuo nuovo gruppo di finestre.
    • Vai al Windowmenu => Open Window Group=> Seleziona il gruppo che hai appena creato.

Questo dovrebbe far apparire tutte le finestre che hai appena avuto, nella stessa posizione. Ognuno dei comandi impostati Settingsdeve essere avviato nelle rispettive schede.


1
Solo una nota, i collegamenti alle immagini di Imageshack nella tua risposta sembrano essere rotti.
Beporter,

Sfortunatamente non ho le immagini, né il vecchio file delle impostazioni per ricrearlo. = - [
Jack M.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.