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

8

Je veux pouvoir ouvrir l'application de terminal et la faire exécuter automatiquement un script qui ouvre plusieurs onglets et exécuter un ensemble arbitraire de commandes dans chacun. Par exemple, j'aimerais qu'un onglet s'ouvre, modifie les répertoires et exécute un serveur rails; ouvrir un autre répertoire, modifier les répertoires et suivre un fichier journal; etc..

Existe-t-il un moyen de le faire avec un script shell ou applescript?

J'ai trouvé cette question, mais elle semble se bloquer si je veux ouvrir des onglets avec des commandes qui ne se terminent pas (comme exécuter le serveur rails).

Andrew Hubbs
la source

Réponses:

5

C'est un peu hacky, mais vous pouvez le faire dans AppleScript. S'il y a un nombre prédéterminé d'onglets que vous voulez et des commandes prédéfinies que vous souhaitez 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, remplacez-la firstCommandpar la commande que vous souhaitez réellement exécuter, etc. Pour une raison quelconque, Terminal n'a pas vraiment de moyen accessible de créer de nouveaux onglets via AppleScript, de sorte que la longue ligne de regard hacky au milieu indique simplement à Terminal de taper Tpour ouvrir ce nouvel onglet, puis de nouvelles commandes s'exécuteront.

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

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

Itai Ferber
la source
2

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

Pour vos onglets que vous ouvrez, cela exécutera un autre fichier de commandes dans chaque onglet, tel qu'un pour tomcat, un pour vous 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
la source
1

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

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

Pour abréger une longue histoire, alias une commande pour faire ce que vous voulez aussi, ou créez un script shell trivial pour faire ce que vous voulez.

Créez un script shell 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 également créer un fichier nommé .bash_profile dans votre répertoire personnel, ou en modifier un 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. Assurez-vous également que le propriétaire exécute le bit au minimum ( chmod 700 myapp.start).

Ensuite, ouvrez Terminal.app, tapez myapp.startet vous avez des rails en cours d'exécution. Sinon, tapez myapuis appuyez sur Tabet laissez la saisie semi-automatique remplir le reste, appuyez sur return. Boom, serveur en cours d'exécution.

Par extension, vous pouvez déjà comprendre comment faire une queue de fichier journal, mais je continuerai quand même. Créez un autre fichier dans ~ / bin nommé myapp.taillog, avec le contenu:

#!/bin/bash

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

Encore une fois, placez-le dans le dossier bin chmod 700 ~/bin/myapp.taillog, puis après le démarrage puis le serveur rails, appuyez rapidement sur t, tapez myapp.tailloget vous avez un fichier journal en cours d'impression.

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

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

La deuxième amélioration est qu'il est probable que vous puissiez écrire un AppleScript qui fasse l'interaction du terminal nécessaire et l'exécution appropriée des commandes à l'intérieur de chacun. Mais franchement, je craque pour AppleScript et je travaille du code bash et du code perl toute la journée, donc je propose des conseils pertinents pour mes compétences :).

Jason Salaz
la source
1

Bien que vous puissiez être lié au terminal Apple en fonction du libellé de votre question, iTerm est supérieur à l'émulateur de terminal par défaut pour l'écriture de scripts et la gestion de plusieurs fenêtres.

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 mieux documenté sur le site Web du développeur . (par rapport au terminal)

Vérifiez-le si vous trouvez que le script du terminal normal ne répond pas à vos besoins. Je vous recommande également fortement de chercher à personnaliser votre shell Unix pour configurer des alias pour les commandes fréquemment utilisées. Vous les utiliserez pour créer des scripts de tâches initiales pour de nouvelles fenêtres, mais aussi chaque fois que vous êtes dans un shell et que vous devez changer de tâche plutôt que d'avoir à ouvrir une nouvelle fenêtre.

bmike
la source
1

Les scripts sont agréables et tout, mais vous pouvez également utiliser Automator pour enregistrer un `` Watch Me Do '' où vous ouvrez Terminal et lancer quelques Command + N pour votre nombre de fenêtres préféré. Et voilà.

David Metcalfe
la source
1

Il y a une excellente réponse à une question très similaire sur StackOverflow, mais elle appartient probablement ici maintenant, donc je vais juste la copier / la coller ici.


C'est tout à fait possible, mais cela demandera du travail de votre part. La première chose dont vous avez besoin est de configurer chaque fenêtre / onglet que vous souhaitez dans vos paramètres.

J'ai 4 onglets que j'ouvre automatiquement à chaque fois que j'ouvre Terminal. DB Shell, Editor, ServerEt Shell. Tout cela fait partie du projet Sasquatch(ne demandez pas), d'où la dénomination. Chacun d'eux devrait alors avoir une commande unique associée à eux.

Dans ce cas, j'exécute vim. S'il vous arrive d'avoir un répertoire spécifique dans lequel vous souhaitez commencer, vous pouvez utiliser quelque chose comme vim ~/projects/main/. Vraiment, tout ce que vous voulez y entrer est la commande que le shell exécutera à son ouverture. Vous devez maintenant ouvrir toutes vos fenêtres / onglets:

  1. Fermez tout.
  2. Ouvrez une nouvelle fenêtre pour chacun de vos profils.
    • Allez dans le Shellmenu => New Tab/ New Window=> Sélectionnez le profil que vous avez créé ci-dessus.
    • Répétez l'opération pour chaque fenêtre ou onglet souhaité.
  3. Une fois toutes vos fenêtres et / ou onglets ouverts, enregistrez-les en tant que groupe de fenêtres.
    • Allez dans le Windowmenu => Save Window As Group....
    • Donnez un nom à votre groupe de fenêtres (cela sera utile plus tard).
    • Si vous souhaitez que ce groupe s'ouvre à chaque fois que vous ouvrez Terminal, cochez la case en bas de cet écran, puis appuyez sur Enregistrer.
  4. Fermez tous vos fenêtres / onglets (il est temps de le tester!).
  5. Ouvrez votre nouveau groupe de fenêtres.
    • Allez dans le Windowmenu => Open Window Group=> Sélectionnez le groupe que vous venez de créer.

Cela devrait faire apparaître toutes les fenêtres que vous venez d'avoir, dans la même position. Chacune des commandes que vous configurez Settingsdoit être lancée dans leurs onglets respectifs.

Jack M.
la source
1
Juste une note, les liens d'image Imageshack dans votre réponse semblent être rompus.
Beporter
Malheureusement, je n'ai pas les images, ni l'ancien fichier de paramètres pour le recréer. = - [
Jack M.