11 votes

Comment écrire un script pour ouvrir plusieurs onglets de terminal et y exécuter du code ?

Je veux pouvoir ouvrir l'application terminal et qu'elle exécute automatiquement un script qui ouvre plusieurs onglets et exécute un ensemble arbitraire de commandes dans chacun. Par exemple, je voudrais qu'un onglet s'ouvre, change les répertoires et exécute un serveur rails ; qu'un autre s'ouvre, change les répertoires et exécute un fichier journal ; etc.

Y a-t-il un moyen de faire cela soit avec un shell script ou applescript ?

J'ai trouvé ceci question mais il semble se bloquer si je veux ouvrir des onglets avec des commandes qui ne se terminent pas (comme l'exécution du serveur rails).

6voto

saturngod Points 179

C'est un peu compliqué, mais vous pouvez le faire en AppleScript. Si vous souhaitez un nombre prédéterminé d'onglets et des commandes prédéfinies à exécuter, ce n'est pas 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

Bien sûr, remplacer firstCommand avec la commande que vous souhaitez exécuter, et ainsi de suite. Pour une raison ou une autre, Terminal n'a pas vraiment de moyen accessible de créer de nouveaux onglets par AppleScript, donc la longue ligne du milieu, qui ressemble à de la bidouille, indique juste à Terminal de taper T pour ouvrir ce nouvel onglet, et les nouvelles commandes s'exécuteront dans celui-ci.

Vous pouvez exécuter cet AppleScript tel quel, ou l'utiliser dans Automator pour créer un nouveau service, que vous pourrez ensuite exécuter de n'importe où à l'aide d'un raccourci clavier si vous le souhaitez.

Extras - Si vous voulez lancer un script/commande dans la session de terminal nouvellement ouverte, vous pouvez vous référer à ce

3voto

bbezanson Points 59

Voici un shell script qui fera ce que vous voulez - pour le Terminal d'Apple ou iTerm (nous avons des utilisateurs des deux).

Pour les onglets que vous ouvrez, ceci exécutera un autre fichier batch dans chaque onglet, comme un pour tomcat, un pour votre 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

1voto

Christopher Scott Points 665

Puisqu'il est si trivial d'ouvrir un nouvel onglet, je vous suggère de rendre l'exécution de vos commandes aussi triviale que possible, et de le faire à l'ancienne.

Vous avez cité deux actions spécifiques, alors travaillons avec celles-ci. Notez que je vais faire beaucoup d'hypothèses basées sur ce que je connais de Rails, mais pas nécessairement spécifiques à votre projet.

Pour faire court, alias une commande pour faire ce que vous voulez qu'elle fasse, ou créez un script shell trivial pour faire ce que vous voulez.

Créer un shell script nommé myapp.start avec le contenu :

#!/bin/bash

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

Vous devrez probablement aussi créer un fichier nommé .bash_profile dans votre répertoire personnel, ou modifier un fichier déjà existant, et ajouter une ligne comme ;

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

Ensuite, créez un répertoire bin dans votre dossier personnel, et déplacez-y le script myapp.start script. Assurez-vous également qu'il possède le bit d'exécution du propriétaire au minimum ( chmod 700 myapp.start ).

Ensuite, ouvrez Terminal.app, tapez myapp.start et vous avez des rails qui fonctionnent. Alternativement, tapez mya puis appuyez sur Tab et laissez l'autocomplétion remplir le reste, appuyez sur return . Boom, le serveur fonctionne.

Par extension, vous avez peut-être déjà compris comment faire une queue de fichier journal, mais je vais quand même continuer. Créez un autre fichier dans ~/bin nommé myapp.taillog, avec le contenu suivant :

#!/bin/bash

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

Là encore, placez-le dans le dossier de la corbeille, chmod 700 ~/bin/myapp.taillog puis après avoir démarré le serveur rails, tapez rapidement sur t , type myapp.taillog et vous avez un fichier journal qui s'imprime.

Deux commandes, deux frappes supplémentaires (ouverture des onglets), c'est peut-être suffisant ?

Il y a deux améliorations très évidentes ici. La première est d'écrire une fonction shell capable de "découvrir" les noms des applications rails, de sorte que vous n'ayez pas à écrire un shell script pour chacune, l'écriture d'une sous-commande conçue pour démarrer webbrick/votre serveur rails de choix, et des commandes pour tail -F'ing quelques fichiers journaux clés de routine.

La deuxième amélioration est qu'il est probable que vous puissiez écrire un AppleScript qui fasse l'interaction nécessaire avec les terminaux, et l'exécution des commandes appropriées dans chacun d'eux. Mais franchement, je suis nul en AppleScript et je travaille avec du code bash et du code perl toute la journée, donc je vous offre des conseils en rapport avec mes compétences :).

1voto

Oskar Points 1242

Bien que vous puissiez être lié au terminal Apple d'après la formulation de votre question, iTerm est supérieur à l'émulateur de terminal par défaut pour le scriptage et la gestion de plusieurs Windows.

Le concept de signets permet de gérer facilement un ensemble de fenêtres. Le scriptage d'iTerm à l'aide d'AppleScript/Automater est plus simple, plus puissant et plus efficace. mieux documenté sur le site web du développeur . (par rapport au terminal)

Jetez-y un coup d'œil si vous trouvez que le scriptage du terminal normal ne répond pas à vos besoins. Je vous recommande également de personnaliser votre shell Unix afin de créer des alias pour les commandes fréquemment utilisées. Vous les utiliserez dans le scriptage des tâches initiales pour les nouvelles fenêtres, mais aussi à chaque fois que vous serez dans un shell et que vous aurez besoin de changer de tâche plutôt que d'ouvrir une nouvelle fenêtre.

1voto

David Metcalfe Points 1172

Les scripts sont sympas et tout, mais vous pourriez aussi simplement utiliser Automator pour enregistrer un 'Watch Me Do' où vous ouvrez Terminal, et lancez quelques Command+N pour votre numéro de Windows préféré. Et voilà.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X