web-dev-qa-db-fra.com

Exécuter un script shell sous OS X sans faire apparaître une fenêtre de terminal?

J'essaie de configurer quelques raccourcis clavier qui ouvrent des sessions iTerm spécifiques, ce que j'ai pu faire avec BetterTouchTool et un peu de magie AppleScript. Le problème est que OS X insiste pour ouvrir une fenêtre de terminal pour tout script Shell que vous exécutez via l’interface graphique (à partir du Finder ou comme raccourci clavier de BetterTouchTool). La fenêtre du terminal n'apparaît pas si j'exécute le script directement à partir d'un autre terminal.

Une solution de contournement que j'ai trouvée consistait à envelopper le script dans un répertoire .app, ce qui résout le problème de la fenêtre de terminal superflue, mais présente d'autres problèmes (par exemple, OS X semble traiter chaque fenêtre iTerm résultante comme une application distincte, encombrant ainsi mon dock. ). (EDIT: ce problème a été causé par un bogue dans mon script, voir ci-dessous)

J'ai également essayé d'attribuer l'application Terminal à un autre bureau virtuel dans les paramètres Spaces pour tenter de la dissimuler, mais le système basculera d'abord sur ce bureau avant d'exécuter le script.

Est-il possible de désactiver complètement ce comportement? J'ai déjà trouvé le paramètre dans les préférences du terminal pour fermer la fenêtre une fois le script terminé, mais il est toujours ennuyeux de voir la fenêtre du terminal s'ouvrir pendant une seconde.

21
toupeira

Ouvrez Automator , choisissez Application , ajoutez un Action d'exécution du script shell et insérez votre commande shell entre guillemets (si vous avez un fichier, vous pouvez simplement le faire glisser).

Autre que de jouer, vous pouvez maintenant enregistrer le (comme une application n'importe où) et même définir l'icône.

18
cregox

Voici un exemple rapide et sale avec presque aucun effort (pour une application nommée "myapp"):

  1. Établissez une hiérarchie partielle des applications:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. Assurez-vous que la première ligne de votre script contient le chemin complet du programme requis, par exemple,

    #!/bin/bash
    
  3. Nommez votre script Shell "myapp" (sans guillemets, sans extension), donnez-lui les autorisations d'exécution, puis placez-le dans le sous-répertoire MacOS. Pour lui donner des autorisations d'exécution:

    chmod ugo+x myapp
    
  4. Allez dans le sous-répertoire Contents et créez un fichier PkgInfo contenant la chaîne: APPL ???? [pas de fin de ligne en fin de chaîne!] Utilisez l'utilitaire cat (1) pour créer le fichier:

    cat > PkgInfo
    APPL????
    

    Après avoir tapé la chaîne (ne pas appuyer sur la touche Entrée!), Entrez deux Ctrl-D, qui se fermeront
    le fichier sans fin de ligne et retournez à l'invite du shell.)

  5. Double-cliquez sur votre nouvelle "application" dans le Finder. Il fonctionnera sans fenêtre.

4
JeffB

Vous voudrez peut-être vérifier Platypus , qui crée des applications Mac OS X à partir de scripts Shell et d'autres scripts interprétés.

4
svth

Voici une solution de contournement au cas où vous voudriez des lanceurs d’application tels que Alfred . Je l'utilise tous les jours et j'ai acheté le Powerpack , qui permet d'exécuter des scripts shell silencieux.

enter image description here

Ceux-ci n'ouvriront pas de terminal lors de l'exécution et peuvent être liés à n'importe quelle séquence de mots-clés. Ils peuvent même inclure des paramètres et avoir des options supplémentaires:

enter image description here

J'utilise ceci pour de petits extraits, et c'est très flexible.

3
slhck

Si vous ajoutez la clé LSUIElement et la définissez sur 1 dans Info.plist de votre application, cela ne créera pas d'icône dans le Dock.

Voici le Info.plist de ma petite application de script shell:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>
1
tig

Il y a un autre entraînement possible. Sécurisez votre script Shell dans un flux de travail d'automateur. Invoquer le workflow avec launchd. Le code est:

/usr/bin/automator /path/to/the/file.workflow

Cela ne lancera aucun programme, ni ne s'affichera dans la barre de menus et sa manière plus silencieuse qu'une application Platypus.

Un moyen encore plus efficace d’exécuter des scripts Shell est direct dans launchd.

/bin/bash /path/to/shellScript.command

exécutera la commande ultra silencieusement en arrière-plan.

0
Atalantia

Voici un peu une solution de contournement:

Compilez un script qui appelle un script shell :)

osacompile -e 'do Shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

La osacompile compilera l'extrait de code 'do Shell script "XXX"' applescript. Votre script Shell est le XXX.

Faites attention aux citations, le script Shell doit être cité correctement pour aller au-delà du Shell que vous utilisez pour le compiler encore intact.

Mais cela peut être exécuté à partir de BetterTouchTool sans aucune astuce.

0
kenny