Come posso scrivere uno script per aprire più schede di terminale ed eseguire il codice al loro interno?

8

Voglio essere in grado di aprire l'applicazione terminale e far sì che esegua automaticamente uno script che apra diverse schede ed esegua un insieme arbitrario di comandi in ciascuna di esse. Ad esempio vorrei aprire una scheda, cambiare directory ed eseguire un server di guide; avere un altro open, cambiare directory e tail un file di log; etc ..

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

Ho trovato questa domanda ma sembra da appendere se voglio aprire le schede con comandi che non terminano (come l'esecuzione del server dei binari).

    
posta Andrew Hubbs 05.06.2011 - 09:28
fonte

6 risposte

5

Questo è un po 'hacky, ma puoi ottenerlo 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

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

    -- And so on...
end tell

Ovviamente, sostituisci firstCommand con qualsiasi comando tu voglia effettivamente eseguire, e così via. Per qualsiasi motivo, Terminal non ha un modo accessibile per creare nuove schede tramite AppleScript, quindi la lunga linea di hacking nel mezzo dice semplicemente a Terminal di digitare T per aprire la nuova scheda, quindi verranno eseguiti nuovi comandi.

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

Varie - Se vuoi attivare qualche script / comando nella sessione terminale appena aperta, puoi fare riferimento a questo

    
risposta data 05.06.2011 - 14:27
fonte
2

Ecco uno script di shell che farà ciò che vuoi - sia per Apple Terminal che per iTerm (abbiamo utenti di entrambi).

Per le tue schede che apri, questo eseguirà un altro file batch in ogni scheda, ad esempio uno per tomcat, uno per 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
    
risposta data 28.08.2015 - 18:05
fonte
1

Dato che è così banale aprire una nuova scheda, ti suggerisco di rendere l'esecuzione dei tuoi comandi il più banale possibile, e di farlo alla vecchia maniera.

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

Per farla breve, crea un comando alias per fare ciò che vuoi o crea uno script shell banale per fare ciò che vuoi.

Crea uno script di shell denominato myapp.start , con i contenuti:

#!/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 tua cartella home e sposta lo script myapp.start in essa. Assicurati inoltre che il proprietario esegua il bit al minimo ( chmod 700 myapp.start ).

Quindi, apri Terminal.app, digita myapp.start e hai le guide in esecuzione. In alternativa, digita m y a quindi premi Tab e lascia che il completamento automatico completi il resto, premi return . Boom, server in esecuzione.

Per estensione, potresti già capire come eseguire un file di log in coda, ma continuerò comunque. Crea un altro file in ~ / bin chiamato myapp.taillog, con i contenuti:

#!/bin/bash

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

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

Due comandi, due tasti aggiuntivi (aprendo le schede), forse è sufficiente?

Ci sono due miglioramenti molto ovvi qui. Uno è quello di 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, la scrittura di un sottocomando progettato per avviare webbrick / il server di scelta dei rails, e comandi per tail -Fing di alcuni file di registro chiave di routine.

Il secondo miglioramento è che è probabile che tu possa scrivere un AppleScript che comporti l'interazione terminale necessaria e l'esecuzione appropriata dei comandi all'interno di ognuno. Ma sinceramente, succhio AppleScript e lavoro in codice bash e codice perl tutto il giorno, quindi offro consigli pertinenti al mio set di competenze:).

    
risposta data 05.06.2011 - 11:00
fonte
1

Sebbene tu possa essere legato al terminale Apple in base al testo della tua domanda, iTerm è superiore all'emulatore di terminale predefinito per scripting e gestione di più finestre.

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

Controllalo se ritieni che lo scripting del terminale normale non soddisfi le tue esigenze. Consiglio inoltre vivamente di personalizzare la shell Unix per impostare alias per i comandi utilizzati più di frequente. Li userete nello scripting delle attività iniziali per le nuove finestre, ma anche ogni volta che siete in una shell e avete bisogno di cambiare attività piuttosto che dover aprire una nuova finestra.

    
risposta data 05.06.2011 - 17:01
fonte
1

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

    
risposta data 06.06.2011 - 00:04
fonte
1

C'è una grande risposta per una domanda molto simile su StackOverflow, ma probabilmente appartiene qui ora, quindi mi limiterò a copiare / pasta qui dentro.

Questo è assolutamente possibile, ma ci vorrà del lavoro da parte tua. La prima cosa di cui hai bisogno è 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 in cui desideri iniziare, puoi utilizzare qualcosa come 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 tue finestre / schede:

  1. Chiudi tutto.
  2. Apri una nuova finestra per ciascuno dei tuoi profili.
    • Vai al menu Shell = > New Tab / New Window = > Seleziona il profilo che hai creato sopra.
    • Ripeti per ogni finestra o scheda che desideri.
  3. Una volta aperte tutte le finestre e / o le schede, salvarle come gruppo finestre.
    • Vai al menu Window = > Save Window As Group... .
    • Dai un nome al tuo gruppo di finestre (questo è utile in seguito).
    • Se vuoi che questo gruppo si apra ogni volta che apri Terminal, seleziona la casella nella parte inferiore di questa schermata e poi premi Salva.
  4. Chiudi tutti i tuoi Windows / Tab (tempo per testarlo!).
  5. Apri il tuo nuovo gruppo di finestre.
    • Vai al menu Window = > Open Window Group = > Seleziona il gruppo che hai appena creato.

Questo dovrebbe far apparire tutte le finestre che hai appena avuto, nella stessa posizione. Ciascuno dei comandi che hai impostato in Settings dovrebbe essere lanciato nelle rispettive schede.

    
risposta data 01.09.2011 - 00:11
fonte

Leggi altre domande sui tag