¿Cómo puedo escribir un script para abrir varias pestañas de terminal y ejecutar código en ellas?

8

Quiero poder abrir la aplicación de terminal y hacer que ejecute automáticamente un script que abra varias pestañas y ejecute un conjunto arbitrario de comandos en cada una. Por ejemplo, me gustaría abrir una pestaña, cambiar directorios y ejecutar un servidor de rieles; tener otro abrir, cambiar directorios y seguir un archivo de registro; etc.

¿Hay alguna forma de hacer esto con un script de shell o un script de manzana?

Encontré esta pregunta pero parece para colgar si quiero abrir pestañas con comandos que no terminan (como ejecutar el servidor de rieles).

    
pregunta Andrew Hubbs 05.06.2011 - 09:28

6 respuestas

5

Esto es un poco complicado, pero puedes lograrlo en AppleScript. Si hay un número predeterminado de pestañas que desea, y comandos preestablecidos que desea ejecutar, esto no es difícil.

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

Por supuesto, reemplace firstCommand con cualquier comando que realmente quiera ejecutar, y así sucesivamente. Por la razón que sea, Terminal no tiene una forma accesible de crear nuevas pestañas a través de AppleScript, por lo que la línea larga y entrecortada que se ve en el medio simplemente le dice a Terminal que escriba T para abrir esa nueva pestaña, y luego se ejecutarán nuevos comandos en ella.

Puede ejecutar este AppleScript tal como está, o usarlo en Automator para crear un nuevo servicio, que luego puede ejecutar desde cualquier lugar usando un atajo de teclado si lo desea.

Extras: si desea activar algún script / comando en la sesión de terminal recién abierta, puede consultar this

    
respondido por el Itai Ferber 05.06.2011 - 14:27
2

Aquí hay un script de shell que hará lo que quieras, tanto para Terminal de Apple como para iTerm (tenemos usuarios de ambos).

Para las pestañas que abra, esto ejecutará otro archivo por lotes en cada pestaña, como uno para Tomcat, otro para su base de datos, etc.

#!/bin/bash

function tab () {
    local cmd=""
    local cdto="$PWD"
    local args="[email protected]"

    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
    
respondido por el bbezanson 28.08.2015 - 18:05
1

Ya que es tan trivial abrir una nueva pestaña, sugeriría que la ejecución de sus comandos sea lo más trivial posible, y hacerlo de la manera más antigua.

Llamaste dos acciones específicas, así que trabajemos con ellas. Tenga en cuenta que haré muchas suposiciones basadas en lo que sé sobre Rails, pero no necesariamente específicas de su proyecto.

Para abreviar una larga historia, alias un comando para hacer lo que quieras, o crea un script de shell trivial para hacer lo que quieras.

Cree un script de shell llamado myapp.start , con el contenido:

#!/bin/bash

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

Es probable que también tenga que crear un archivo llamado .bash_profile en su directorio de inicio, o modificar uno ya existente, y agregar una línea como;

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

Luego, cree un directorio bin en su carpeta de inicio y mueva el script myapp.start a ella. Asegúrese también de que el propietario ejecute el bit como mínimo ( chmod 700 myapp.start ).

Luego, abre Terminal.app, escribe myapp.start , y tienes rieles en ejecución. Alternativamente, escriba my a luego presione Tabulación , y deje que el autocompletar complete el resto, presione para regresar . Boom, servidor en ejecución.

Por extensión, es posible que ya entiendas cómo hacer una cola del archivo de registro, pero continuaré de todos modos. Cree otro archivo en ~ / bin llamado myapp.taillog, con el contenido:

#!/bin/bash

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

Nuevamente, colóquelo en la carpeta bin, chmod 700 ~/bin/myapp.taillog , luego, después de iniciar el servidor de rails, presione rápidamente t , escriba myapp.taillog , y tendrá un archivo de registro que se está imprimiendo.

Dos comandos, dos teclas adicionales (abriendo las pestañas), ¿quizás eso sea suficiente?

Hay dos mejoras muy obvias aquí. Una es escribir una función de shell capaz de "descubrir" los nombres de las aplicaciones de rieles, de modo que no tenga que escribir un script de shell para cada una, la escritura de un subcomando diseñado para iniciar webbrick / el servidor de rieles de su elección, y Comandos para cola -F'ing unos pocos archivos clave de registro de forma rutinaria.

La segunda mejora es que es probable que pueda escribir un AppleScript que realice la interacción del terminal necesaria y la ejecución apropiada de los comandos dentro de cada uno. Pero, francamente, apesto en AppleScript y trabajo en código bash y código perl todo el día, por lo que ofrezco consejos relevantes para mi conjunto de habilidades :).

    
respondido por el Jason Salaz 05.06.2011 - 11:00
1

Aunque podría estar vinculado al terminal de Apple según la redacción de su pregunta, iTerm es superior al emulador de terminal predeterminado para scripting y gestión de múltiples ventanas.

El concepto de marcadores permite la administración fácil de un conjunto de ventanas. Las secuencias de comandos de iTerm utilizando AppleScript / Automater son más sencillas, más potentes y están mejor documentadas en el sitio web del desarrollador . (en comparación con el terminal)

Verifíquelo si encuentra que las secuencias de comandos de una terminal normal no satisfacen sus necesidades. También recomiendo encarecidamente que personalice su shell de Unix para configurar alias para los comandos de uso frecuente. Los usará en las tareas iniciales de scripting para nuevas ventanas, pero también en cualquier momento que esté en un shell y necesite cambiar de tareas en lugar de tener que abrir una nueva ventana.

    
respondido por el bmike 05.06.2011 - 17:01
1

Los scripts son agradables y todo, pero también puedes usar Automator para grabar un 'Watch Me Do' en el que abres la Terminal, y lanzar algunas Command + N para tu número preferido de ventanas. Et voila.

    
respondido por el David Metcalfe 06.06.2011 - 00:04
1

Hay un gran respuesta a una pregunta muy similar sobre StackOverflow, pero probablemente pertenece aquí ahora, así que solo lo copiaré / pegaré aquí.

Esto es absolutamente posible, pero tomará un poco de trabajo de su parte. Lo primero que necesita es configurar cada ventana / pestaña que desee en su Configuración.

Tengo 4 pestañas que abro automáticamente cada vez que abro Terminal. DB Shell , Editor , Server y Shell . Estos están todos dentro del proyecto Sasquatch (no preguntar), por lo tanto, la denominación. Cada uno de estos debería tener un comando único asociado.

En este caso, estoy ejecutando vim . Si tienes un directorio específico en el que te gustaría comenzar, puedes usar algo como vim ~/projects/main/ . Realmente, lo que sea que quieras es el comando que ejecutará el shell cuando se abra. Ahora necesitas abrir todas tus ventanas / pestañas:

  1. Cierra todo.
  2. Abre una nueva ventana para cada uno de tus perfiles.
    • Vaya al menú Shell = > New Tab / New Window = > Seleccione el perfil que creó anteriormente.
    • Repita para cada ventana o pestaña que desee.
  3. Una vez que tenga todas sus ventanas y / o pestañas abiertas, guárdelas como un grupo de ventanas.
    • Vaya al menú Window = > Save Window As Group... .
    • Asigne un nombre a su grupo de ventanas (esto es útil más adelante).
    • Si desea que este grupo se abra cada vez que abra Terminal, marque la casilla en la parte inferior de esta pantalla y luego presione guardar.
  4. Cierre todas sus Windows / Tabs (¡es hora de probarlo!).
  5. Abre tu nuevo grupo de ventanas.
    • Vaya al menú Window = > Open Window Group = > Seleccione el grupo que acaba de crear.

Esto debería mostrar todas las ventanas que acaba de tener, en la misma posición. Cada uno de los comandos que configura en Settings debe iniciarse en sus respectivas pestañas.

    
respondido por el Jack M. 01.09.2011 - 00:11

Lea otras preguntas en las etiquetas