Exécuter des scripts Shell à partir du Dock OS X?

160

Comment configurer un script shell à exécuter à partir du dock Mac OSX? Il semble que la simple création d'un raccourci ouvrira le fichier dans mon éditeur. Dois-je définir un indicateur quelque part pour lui dire de s'exécuter au lieu de l'ouvrir pour le modifier?

Wilco
la source
2
devrait +1 uniquement pour l'avatar, même si j'aime aussi le sujet.
Matt Bannert
Vous voudrez peut-être envisager de remplacer les réponses acceptées par la deuxième @Wilco. Je pense que c'est une meilleure réponse.
Gray

Réponses:

190

Vous pouvez créer un flux de travail Automator en une seule étape - "Exécuter le script Shell"

Ensuite File > Save As, changez le format de fichier en "Application". Lorsque vous ouvrez l'application, elle exécutera l'étape de script Shell, exécutant la commande, puis se fermant une fois celle-ci terminée.

L'avantage est que c'est vraiment simple à faire, et vous pouvez très facilement obtenir l'entrée de l'utilisateur (par exemple, sélectionner un tas de fichiers), puis la transmettre à l'entrée du script shell (soit à stdin, soit en tant qu'arguments).

(Automator est dans votre /Applicationsdossier!)

Exemple de workflow

dbr
la source
6
@dbr, poussoir de bouton GUI! :) Je plaisante, c'est une bonne suggestion!
willasaywhat
Ouais, c'était une excellente suggestion :) J'ai même écrit des actions Automator pour certaines de mes applications et je l'oublie encore dans des moments comme celui-ci :)
Jason Coco
Je ne peux pas faire fonctionner cela avec nohup, à la "nohup / usr / bin / myscript &; disown -a && exit 0". J'ai besoin de l'application / du workflow pour exécuter un script et quitter immédiatement. Des idées? :-)
heureback le
3
@martineau Si vous ouvrez l'application en faisant open -a SomeAppThing.app --args --etc=2cela devrait se concentrer. Vous pouvez également le concentrer en utilisant Applescript (par exemple osascript -e 'tell application "Google Chrome" to activate')
dbr
1
Remarque: si votre script lance une application GUI qui restera ouverte pendant un certain temps, cela affichera une icône d'engrenage en rotation constante dans la barre des tâches jusqu'à ce que l'application soit fermée. Une solution consiste à ajouter `&> / dev / null &` à la ligne de lancement du script pour qu'Automator n'attende pas.
ewall
50

Si vous n'avez pas besoin d'une fenêtre Terminal, vous pouvez faire de n'importe quel fichier exécutable une application simplement en créant un script shell Exampleet en le déplaçant vers le nom de fichier Example.app/Contents/MacOS/Example. Vous pouvez placer cette nouvelle application dans votre dock comme n'importe quelle autre, et l'exécuter en un clic.

REMARQUE: le nom de l'application doit correspondre exactement au nom du script. Ainsi, le répertoire de niveau supérieur doit être Example.appet le script dans le Contents/MacOSsous - répertoire doit être nommé Example, et le script doit être exécutable.

Si vous avez besoin d'afficher la fenêtre du terminal, je n'ai pas de solution simple. Vous pourriez probablement faire quelque chose avec Applescript, mais ce n'est pas très clair.

Jeremy Banks
la source
1
Vous ne savez pas s'il existe un moyen simple de faire passer des fichiers comme arguments au script shell? Pour les fichiers ouverts avec "ouvrir avec ...".
Fuzzy76
9
Pour quiconque essaie de faire cela, le nom de l'application doit correspondre exactement au nom du script. Il faut donc vraiment que ce soit le cas example.sh.app, pas seulement example.app. Vous recevrez un avertissement concernant l'application endommagée si ceux-ci ne correspondent pas
Kip
1
Pour clarifier - je suis un noob OSX - vous voulez simplement créer une structure de dossiers comme celle montrée dans votre exemple avec le fichier de script placé comme indiqué?
martineau
2
@martineau Oui, c'est exact. Si vous créez un dossier dont le nom se termine par .appet avec cette structure, il sera traité comme une application exécutable. Si vous souhaitez consulter le contenu de ce dossier dans le Finder, vous devrez cliquer dessus avec le bouton droit de la souris et sélectionner "Afficher le contenu du package" (car un double-clic sur celui-ci lancerait l'application). Dans le terminal, il apparaîtra simplement comme un dossier. (Je ne sais pas si Finder vous permettra de renommer le dossier en .app par lui-même; vous devrez peut-être le renommer dans le terminal.)
Jeremy Banks
1
Je viens de tenter ceci, et j'ai reçu une erreur dans El Capitan (10.11) de: "Vous ne pouvez pas ouvrir ... parce que les applications powerpc ne sont plus prises en charge." : D C'est assez intéressant!
AllenH
26

Sur OSX Mavericks:

  1. Créez votre script shell.
  2. Rendez votre script shell exécutable:

    chmod +x your-shell-script.sh
  3. Renommez votre script pour avoir un .appsuffixe:

    mv your-shell-script.sh your-shell-script.app
  4. Faites glisser le script vers le dock OSX.
  5. Renommez votre script en .shsuffixe:

    mv your-shell-script.app your-shell-script.sh
  6. Cliquez avec le bouton droit sur le fichier dans le Finder, puis cliquez sur l'option "Obtenir des informations".
  7. En bas de la fenêtre, définissez le script shell pour qu'il s'ouvre avec le terminal.

Maintenant, lorsque vous cliquez sur le script dans le dock, une fenêtre de terminal apparaîtra et exécutera votre script.

Bonus: pour que le terminal se ferme lorsque votre script est terminé, ajoutez exit 0à la fin et modifiez les paramètres du terminal pour "fermer le shell si vous quittez proprement" comme il est indiqué dans cette réponse SO .

stiemannkj1
la source
Bien, cela a fonctionné pour moi, de toute façon de risquer l'icône que je me demande. FYI: Également l'étape 7 fait référence au fichier et non à l'élément de menu ...
Mike Q
le chemin sympa! juste tout .sh avec terminal ouvert.
iHTCboy
@ stiemannkj1, cela montre-t-il l'icône pendant que l'application est en cours d'exécution? Est-il possible de le cacher?
Pacerier du
@Pacerier, désolé, je ne suis plus sous OSX (passé sous Linux :)). Vous voudrez peut-être essayer la réponse de Jeremy Bank . Je n'ai pas d'autres idées et comme je n'ai pas OSX, je ne peux pas tester ou jouer avec quoi que ce soit pour essayer d'afficher / masquer l'icône ..
stiemannkj1
17

Je sais que c'est vieux mais au cas où cela serait utile aux autres:

Si vous avez besoin d'exécuter un script et que vous voulez que le terminal apparaisse pour voir les résultats, vous pouvez faire comme Abyss Knight l'a dit et changer l'extension en .command. Si vous double-cliquez dessus, une fenêtre de terminal s'ouvre et s'exécute.

J'avais cependant besoin de cela pour fonctionner à partir d'automate ou d'AppleScript. Donc, pour que cela ouvre un nouveau terminal, la commande que j'ai exécutée à partir de "exécuter le script shell" était "open myShellScript.command" et elle s'est ouverte dans un nouveau terminal.

Jason Tholstrup
la source
merveilleux, merci! Maintenant, tous ont besoin de vouloir en faire une solution parfaite serait un moyen de fermer la fenêtre du terminal lorsque le script se termine.
Peter M
1
eh bien, si vous avez sélectionné Fermer la fenêtre à la sortie dans les préférences du terminal, vous pouvez ajouter la commande de sortie à votre script et vous aurez ce que vous voulez.
Jason Tholstrup
7

Tant que votre script est exécutable et n'a pas d'extension, vous pouvez le faire glisser tel quel sur le côté droit (côté Document) du Dock et il fonctionnera dans une fenêtre de terminal lorsque vous cliquez dessus au lieu d'ouvrir un éditeur.

Si vous souhaitez avoir une extension (comme foo.sh), vous pouvez accéder à la fenêtre d'informations sur le fichier dans le Finder et modifier l'application par défaut pour ce script particulier quelle qu'elle soit (TextEdit, TextMate, quelle que soit la valeur par défaut définie sur votre ordinateur pour .sh) vers le terminal. Il s'exécutera alors simplement au lieu de s'ouvrir dans un éditeur de texte. Encore une fois, vous devrez le faire glisser vers le côté droit du Dock.

Jason Coco
la source
1
REMARQUE : cela fonctionne comme un champion dans OS X 10.10 Yosemite. Je ne peux pas commenter le 10.9
Bryan Ash
1
Fonctionne sur 10.11. Je vous remercie!
Yassine Imounachen
Fonctionne aussi sur 10.12! Peut-être que mon commentaire sur 10.9 était incorrect, mais j'ai remarqué que vous devez vous assurer de le faire glisser vers la partie du dock sous le séparateur. Je n'ai aucun moyen de tester à nouveau 10.9 malheureusement.
stiemannkj1
Pas besoin de l'ajouter au Dock. Il peut être exécuté à partir du bureau. Mais il ne peut y avoir aucune extension. Rendez-le exécutable et vous pouvez simplement double-cliquer. C'est l'option la plus simple que j'ai vue.
Rich Apodaca
5

Je pense que ce fil peut être utile: http://forums.macosxhints.com/archive/index.php/t-70973.html

Pour paraphraser, vous pouvez le renommer avec l'extension .command ou créer un AppleScript pour exécuter le shell.

willasay what
la source
Sur Snow Leopard au moins, l'ajout d'une extension .command à un script le fait fonctionner dans le terminal si vous double-cliquez dessus, mais pour une raison quelconque, vous ne pouvez toujours pas le faire glisser dans le dock. Les suggestions de dbr et de Jeremy ont cependant fonctionné pour moi.
Jo Liss
5

Comme joe l'a mentionné, créer le script shell, puis créer un script applescript pour appeler le script shell, accomplira cela, et est très pratique.

Script de Shell

  1. Créez votre script shell dans votre éditeur de texte préféré, par exemple:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (cela exécute l'exécutable w32, en utilisant le framework mono)

  2. Enregistrer le script shell, pour mon exemple "StartKeepass.sh"

Script Apple

  1. Ouvrez AppleScript Editor et appelez le script shell

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script - commande applescript pour appeler des commandes shell externes
    • "sh ...." - ceci est votre script shell (chemin complet) créé à la première étape (vous pouvez également exécuter des commandes directes, je pourrais omettre le script shell et simplement exécuter ma commande mono ici)
    • user name - déclare à applescript que vous souhaitez exécuter la commande en tant qu'utilisateur spécifique
    • "<enter username here> - remplacer par votre nom d'utilisateur (en gardant les guillemets) ex "josh"
    • password - déclare à applescript votre mot de passe
    • "<enter password here>" - remplacez par votre mot de passe (en gardant les guillemets) ex "mypass"
    • with administrative privileges - déclare que vous souhaitez exécuter en tant qu'administrateur

Créez votre .APP

  1. enregistrez votre applescript sous nomfichier.scpt, dans mon cas RunKeepass.scpt

  2. enregistrez sous ... votre applescript et changez le format de fichier en application, ce qui entraîne RunKeepass.app dans mon cas

  3. Copiez votre fichier d'application dans votre dossier d'applications

CJoshDoll
la source
5

Dans l'éditeur de script:

do shell script "/full/path/to/your/script -with 'all desired args'"

Enregistrez en tant qu'ensemble d'applications.

Tant que tout ce que vous voulez faire est d'obtenir l'effet du script, cela fonctionnera bien. Vous ne verrez ni STDOUT ni STDERR.

Joe McMahon
la source
2
Je suggérerais: "Enregistrer en tant que lot d'application". Les bundles se lancent beaucoup plus rapidement que les applications.
e.James
-3

Quelqu'un a écrit ...

Je viens de définir tous les fichiers qui se terminent par ".sh" pour ouvrir avec Terminal. Cela fonctionne bien et vous n'avez pas à changer le nom de chaque script shell que vous souhaitez exécuter.

Jonny
la source