¿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 abre varias pestañas y ejecuta 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 Applecript?

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

Andrew Hubbs
fuente

Respuestas:

5

Esto es un poco hacky, 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 quiera ejecutar, y así sucesivamente. Por alguna razón, 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 hacky en el medio solo le dice a 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 utilizando 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 esto

Itai Ferber
fuente
2

Aquí hay un script de shell que hará lo que desee, tanto para el 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 usted db, 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
bbezanson
fuente
1

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

Invocaste 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ífico de su proyecto.

Para abreviar 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

Probablemente también tendrá 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 él. Asegúrese también de que el propietario ejecute el bit como mínimo ( chmod 700 myapp.start).

Luego, abra Terminal.app, escriba myapp.start, y tendrá rieles en ejecución. Alternativamente, escriba y myaluego presione Tab, y deje que el autocompletado llene el resto, presione return. Boom, servidor en ejecución.

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

Una vez más, colóquelo en la carpeta bin chmod 700 ~/bin/myapp.taillog, luego, después de comenzar, rails server, presione rápidamente t, escriba myapp.taillogy tendrá un archivo de registro que se imprimirá.

Dos comandos, dos teclas adicionales (abrir las pestañas), ¿tal vez eso es 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, para que no tenga que escribir un script de shell para cada uno, escribir un subcomando diseñado para iniciar webbrick / su servidor de rails de elección, y comandos para tail -F'ing algunos archivos de registro de claves 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, soy un asco en AppleScript y trabajo en código bash y código perl todo el día, por lo que estoy ofreciendo consejos relevantes para mi conjunto de habilidades :).

Jason Salaz
fuente
1

Aunque es posible que esté vinculado al terminal de Apple en función de la redacción de su pregunta, iTerm es superior al emulador de terminal predeterminado para crear secuencias de comandos y administrar múltiples ventanas.

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

Verifíquelo si encuentra que la secuencia de comandos del terminal normal no satisface sus necesidades. También le recomiendo que busque personalizar su shell de Unix para configurar alias para los comandos de uso frecuente. Los usará en la creación de scripts de tareas iniciales para nuevas ventanas, pero también cada vez que se encuentre en un shell y necesite cambiar tareas en lugar de tener que abrir una nueva ventana.

bmike
fuente
1

Las secuencias de comandos son agradables y todo, pero también puedes usar Automator para grabar un 'Watch Me Do' donde abres Terminal y arrojar algunos Command + N para tu número preferido de ventanas. Et voila.

David Metcalfe
fuente
1

Hay una gran respuesta a una pregunta muy similar en StackOverflow, pero probablemente pertenece aquí ahora, así que simplemente 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. Todos estos están dentro delSasquatch (no preguntar), por lo tanto, la denominación. Cada uno de estos debería 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, sea lo que sea lo que quiera ingresar, es el comando que el shell ejecutará cuando se abra. Ahora necesita abrir todas sus ventanas / pestañas:

  1. Cierra todo.
  2. Abra una nueva ventana para cada uno de sus 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.
    • Vaya al Windowmenú => Save Window As Group....
    • Dé un nombre a su Grupo de ventanas (esto es útil más adelante).
    • Si desea que este grupo se abra cada vez que abra la Terminal, marque la casilla en la parte inferior de esta pantalla y luego presione guardar.
  4. Cierre todos sus Windows / Tabs (¡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 acaba de tener, en la misma posición. Cada uno de los comandos que configure Settingsdebe iniciarse en sus pestañas respectivas.

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