Comment exécuter un script shell sous OS X en double-cliquant?

233

J'ai un script shell qui dispose d'une autorisation d'exécution utilisateur sur OS X, mais lorsque je double-clique dessus, il s'ouvre dans un éditeur de texte. Comment puis-je le faire fonctionner en double-cliquant dessus?

c2h2
la source

Réponses:

266
  • Tout d'abord dans le terminal, rendez le script exécutable en tapant:

    chmod a+x (yourscriptname)
  • Ensuite, dans le Finder, faites un clic droit sur votre fichier et sélectionnez "Ouvrir avec" puis "Autre ...".

  • Ici, vous sélectionnez l'application dans laquelle vous souhaitez que le fichier s'exécute, dans ce cas, ce sera Terminal. Pour pouvoir sélectionner le terminal, vous devez passer de "Applications recommandées" à "Toutes les applications". (L'application Terminal.app se trouve dans le dossier Utilitaires)

  • REMARQUE: sauf si vous ne souhaitez pas associer tous les fichiers à cette extension pour les exécuter dans le terminal, vous ne devez pas cocher "Toujours ouvrir avec".

  • Après avoir cliqué sur OK, vous devriez pouvoir exécuter votre script en double-cliquant simplement dessus.
Lus
la source
merci je l'ai eu, je ne savais pas
m'associer
22
Je n'ai pas trouvé Terminal.app dans la liste jusqu'à ce que je réalise que je devais chercher dans le dossier "Utilitaires". Espérons que cela fera gagner du temps à quelqu'un.
Glenn Lawrence
27
Sous OSX 10.8 et supérieur, un script exécutable dont les noms n'ont ni suffixe ni suffixe .commandest par défaut exécutable à partir du Finder, sans qu'il soit nécessaire de demander au Finder comment l'ouvrir.
mklement0
1
"Toutes les applications" est le paramètre qui me manquait ... probablement ce que Cheruvim a également vécu. Quant au commentaire de Glenn: vous pouvez simplement utiliser la fonction de recherche intégrée dans le coin supérieur droit de la fenêtre; assurez-vous de taper le nom complet de l'application, c'est-à-dire Terminal.app.
aîné aîné
3
Pas la façon la plus simple de le faire. Renommez votre script en .commandextension de fichier.
Bachsau
227

Avez-vous essayé d'utiliser l' .commandextension de nom de fichier?

Hagelin
la source
3
C'est mieux. Dans la réponse @Lus, le dossier de travail n'est pas le même que celui que vous ouvrez le script.
Rodrigo
6
Existe-t-il un moyen de lancer des tâches "d'arrière-plan" sans fenêtre de console?
lapo
6
Veuillez noter que le répertoire actuel n'est peut-être pas celui dans lequel se trouve votre script. Jetez un œil à cette question pour le corriger
Pavel Alexeev
14
Vous devez toujours avoir la permission d'exécution ( chmod +x) mais l' .commandextension est déjà liée à Terminal. Excellente solution, merci
NorTicUs
Apparemment, l'utilisateur ne peut pas interagir avec le programme du terminal avec cette méthode - à moins que je ne me trompe?
Demis
153

Depuis OSX 10.10 (Yosemite) et depuis au moins OS X 10.8 (Mountain Lion) , le comportement est le suivant lorsque vous ouvrez (double-cliquez) des scripts exécutables à partir du Finder :

  • Scripts exécutables [1] avec AUCUN suffixe ou suffixe.command :
    • sont exécutés par défaut - aucune configuration requise :
      • une nouvelle fenêtre Terminal s'ouvre dans laquelle le script s'exécute.
      • par défaut, la fenêtre restera ouverte après la fin du script afin que vous puissiez inspecter la sortie (bien qu'à ce moment le shell qui a exécuté le script soit sorti et que vous ne puissiez plus interagir avec lui ).
        Cependant, via Terminal, Preferences... > Profilesvous pouvez choisir de fermer automatiquement la fenêtre à la fin du script.
    • Caveat : le dossier de travail est toujours l' utilisateur actuel du dossier de base , pas le dossier dans lequel se trouve le script.
      • Pour modifier un script shell dans le dossier dans lequel il se trouve, placez
        • cd -- "$(dirname "$BASH_SOURCE")" juste après la ligne de shebang
        • ou, si vous devez rester conforme POSIX, cd -- "$(dirname "$0")".
        • Pour les cas extrêmes , tels que la recherche du véritable répertoire source d' un script lié , voir ma réponse .
    • Si le script n'est pas exécutable de manière inattendue :
      • Rendez-le exécutable en exécutant chmod +x <script>dans Terminal; sinon, vous verrez les symptômes suivants:
      • .command: Finder affiche un message d'erreur trompeur qui suggère que le problème peut être résolu via File > Get Info, ce qui n'est pas vrai - utilisez la chmod +xméthode suggérée ci-dessus.
      • pas de suffixe:
        • avec une ligne de shebang (par exemple, #!/bin/bash): le comportement est comme si le suffixe était .sh- voir ci-dessous.
        • avec aucune ligne tralala: ouvre dans votre éditeur de texte par défaut ( ce qui est TextEdit par défaut).
  • Scripts avec suffixe.sh , exécutables ou non:
    • sont ouverts pour modification dans TextEdit.appou, si installés, avec Xcode.app.
  • Scripts avec suffixe.scpt ou .applescript(même s'ils sont eux-mêmes marqués comme exécutables, ce qui n'est normalement pas le cas):
    • ouvert pour modification dans[Apple]Script Editor
    • Notez que les fichiers de code source JXA semblent (encore) ne pas avoir de suffixe distinct.
  • Scripts avec un suffixe personnalisé (un suffixe non encore connu du système), qu'il soit exécutable ou non (s'applique en fait à tout type de fichier):
    • vous invite à ouvrir l'application avec lorsque vous les ouvrez pour la première fois , et n'oubliez pas ce choix .

[1] Exécutable signifie: un script avec le ou les bits d'autorisation exécutables définis et l'utilisateur appelant - relatif à la propriété du fichier - donc potentiellement autorisé à l'exécuter.
Si vous utilisez chmod a+xpour définir tous les bits d'autorisation (ce qui est typique), n'importe qui peut l'invoquer (en supposant qu'il est également autorisé à lire le fichier en fonction du ou des bits d'autorisation de lecture et de la propriété du fichier).

mklement0
la source
1
Il est possible de fermer la fenêtre Terminal ouverte lorsque le script se termine avec un simple que osascriptvous pouvez inclure dans le .commandfichier au lieu de jouer manuellement avec le profil.
l'L'l
@ I'L'I: Voulez-vous dire ajouter une osascript -e '...'commande à la fin de son script? Quelle est la commande spécifique et garantit-elle que l'onglet de droite est fermé même lorsque le script ne s'exécute pas dans l'onglet le plus en avant?
mklement0
5
@ mklement0: Oui, je ne l'ai pas testé depuis plus de quelques minutes, mais l'idée de base est d'inclure sur la dernière ligne du script .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Cela pourrait ne pas fonctionner dans tous les scénarios, bien que la redirection à la end est vraiment la clé - l'osascript peut sinon être facilement adapté (par exemple , il peut être nécessaire de changer la fenêtre en tab si c'est le comportement par défaut de votre terminal, etc.).
l'L'l
Est-il possible de ne pas laisser la fenêtre / l'onglet Terminal se fermer après l' .commandexécution du fichier de script malgré le paramètre de profil?
CyberMew
@CyberMew: Si vous pouvez modifier le script, ajoutez une commande qui attend une frappe à la fin; par exemple, si c'est un bashscript, ajoutez read -p 'Press Return to close this window.'comme dernière instruction.
mklement0
38

Vous pouvez également créer une application Mac OS X standard à partir de votre script à l'aide de Platypus

svth
la source
Ceci est une très bonne application. Mais j'ai un problème ici. J'ai un script python que je veux convertir en fichier .app. Mon script comprend une ligne où l'utilisateur doit taper une entrée (raw_input ()), lorsque le .app atteint cette ligne de code, il génère une erreur EOF (fin de fichier). Que puis-je faire à ce sujet?
1
Ce n'est pas un terminal interactif. Platypus présente simplement la sortie du script. Il n'y a pas de communication bidirectionnelle.
svth
4
Ou créez une application OS X avec Automator à l'aide de l'action Exécuter le script Shell.
Rangi Keen
15

Le moyen le plus simple consiste à modifier l'extension en .commandou aucune extension.

Mais cela ouvrira le terminal et vous devrez le fermer. Si vous ne voulez voir aucune sortie, vous pouvez utiliser Automator pour créer une application Mac que vous pouvez double-cliquer, ajouter au dock, etc.

  1. Ouvrir l' Automatorapplication
  2. Choisissez le type "Application"
  3. Tapez "exécuter" dans la zone de recherche Actions
  4. Double-cliquez sur "Exécuter le script Shell"
  5. Cliquez sur le Runbouton dans le coin supérieur droit pour le tester.
  6. File > Save pour créer l'application.

entrez la description de l'image ici

wisbucky
la source
Génial ! Comment automatiser ce workflow pour qu'il s'exécute quotidiennement à 13 h?
iAkshay
9

Pas besoin d'utiliser des applications tierces telles que Platypus.

Créez simplement un script Apple avec Script Editor et utilisez la commande do shell script "shell commands"pour des appels de commande directs ou des fichiers de script shell exécutables, conservez le fichier de script modifiable en sécurité quelque part, puis exportez-le pour créer un script d'application. le script de l'application peut être lancé par double-clic ou sélection dans le dossier de la barre.

Luc-Olivier
la source
3
Encore mieux, utilisez Automator et utilisez l'action Exécuter le script Shell directement plutôt que de passer par Apple Script.
Rangi Keen
0

Vous pouvez également définir des valeurs par défaut par extension de fichier à l'aide de RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

vous pourriez éventuellement définir .sh pour l'ouvrir dans iTerm / Terminal, etc.

chmod u+x filename.sh

Panneau de préférences RCDefaultApp

Tomachi
la source
0

chmod 774 filename

Remarque : le fichier avec le nom «nom de fichier» qui a le script bash n'a pas d'extension

Néo
la source