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

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 Rails; tener otro abierto, cambiar directorios y seguir un archivo de registro; etc..

¿Hay alguna manera de hacer esto con un script de shell o un applescript?

Encontré esta pregunta , pero parece bloquearse si quiero abrir pestañas con comandos que no terminan (como ejecutar el servidor Rails).

Respuestas (6)

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

    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

Por supuesto, reemplácelo firstCommandcon el comando que realmente desee ejecutar, y así sucesivamente. Por la razón que sea, la Terminal realmente no tiene una forma accesible de crear nuevas pestañas a través de AppleScript, por lo que la línea larga y de aspecto extraño en el medio solo le dice a la Terminal que escriba Tpara 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 este

Aquí hay un script de shell que hará lo que quieras, tanto para la 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, uno para su base de datos, etc.

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

Dado 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 a la antigua.

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

Para acortar una larga historia, alias un comando para hacer lo que quieras también, 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 deba 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 él. Asegúrese también de que el propietario ejecute bit como mínimo ( chmod 700 myapp.start).

Luego, abre Terminal.app, escribe myapp.starty tendrás Rails funcionando. Alternativamente, escriba myay luego presione Tab, y deje que autocompletar complete el resto, presione return. Boom, servidor funcionando.

Por extensión, es posible que ya comprenda cómo hacer una cola de 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 Rails, presione rápidamente t, escriba myapp.taillogy tendrá un archivo de registro que se está imprimiendo.

Dos comandos, dos pulsaciones de teclas adicionales (abrir las pestañas), ¿quizás 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 Rails, de modo que no tenga que escribir un script de Shell para cada una, escribir un subcomando diseñado para iniciar webbrick/su servidor de Rails de su elección, y comandos para cola -F'ing algunos archivos de registro clave de forma rutinaria.

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

Aunque es posible que esté atado a la terminal de Apple según la redacción de su pregunta, iTerm es superior al emulador de terminal predeterminado para crear secuencias de comandos y administrar varias ventanas.

El concepto de marcadores permite gestionar fácilmente un conjunto de ventanas. La creación de secuencias de comandos de iTerm con AppleScript/Automater es más simple, más potente y está mejor documentada en el sitio web del desarrollador . (en comparación con la terminal)

Compruébelo si encuentra que las secuencias de comandos de la terminal normal no satisfacen sus necesidades. También le recomiendo encarecidamente que busque personalizar su shell de Unix para configurar alias para los comandos de uso frecuente. Los usará en las secuencias de comandos de tareas iniciales para nuevas ventanas, pero también cada vez que esté en un shell y necesite cambiar de tarea en lugar de tener que abrir una nueva ventana.

Las secuencias de comandos son agradables y todo eso, pero también puede usar Automator para grabar un 'Mírame hacer' donde abres Terminal y lanzas algunos Comando + N para tu número preferido de ventanas. Et voila.

Hay una gran respuesta a una pregunta muy similar en StackOverflow, pero probablemente pertenezca aquí ahora, así que simplemente la copiaré/pegaré aquí.


Esto es absolutamente posible, pero requerirá algo 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, Servery Shell. Todos estos están dentro del Sasquatchproyecto (no preguntes), por lo tanto, el nombre. Cada uno de estos debe tener un comando único asociado con ellos.

En este caso, estoy ejecutando vim. Si tiene un directorio específico en el que le gustaría comenzar, puede usar algo como vim ~/projects/main/. Realmente, lo que sea que desee ingresar, es el comando que ejecutará el shell cuando se abra. Ahora necesita abrir todas sus ventanas/pestañas:

  1. Cierra todo.
  2. Abre una nueva ventana para cada uno de tus perfiles.
    • Vaya al Shellmenú => 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.
    • Ir al Windowmenú => Save Window As Group....
    • Asigne un nombre a su grupo de ventanas (esto será ú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. Cierra todas tus ventanas/pestañas (¡es hora de probarlo!).
  5. Abra su nuevo grupo de ventanas.
    • Vaya al Windowmenú => Open Window Group=> Seleccione el grupo que acaba de crear.

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

Solo una nota, los enlaces de imágenes de Imageshack en su respuesta parecen estar rotos.
Desafortunadamente no tengo las imágenes, ni el archivo de configuración anterior para volver a crearlo. =-[