web-dev-qa-db-fra.com

Comment exécuter une application avec des arguments de ligne de commande sous Mac OS

Existe-t-il un moyen simple d’ajouter des arguments de ligne de commande à une application sur un Mac? Par exemple, pour exécuter Opera en mode kiosk ou pour utiliser un profil différent dans Firefox, je peux saisir

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

Sous Windows, je peux ajouter les arguments aux propriétés du raccourci, mais comme les Mac n’utilisent pas de raccourci en soi et n’exécutent pas les applications directement, cela n’est pas possible.

J'ai constaté que le lancement des applications via bash ou Applescript fonctionnait partiellement:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do Shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Je peux créer ces exécutables et attribuer une icône. Tout fonctionne parfaitement, sauf que lorsque je lance l'un de ces pseudo programmes, une fenêtre de terminal ou une icône Applescript reste ouverte tant que l'application est ouverte. Vraisemblablement, utiliser la commande Applescript open permettrait d'éviter cela, mais comme je n'exécute pas l'application telle qu'elle est empaquetée (uniquement /Applications/Firefox), elle ne fonctionne pas.

Alors, y a-t-il un meilleur moyen d’exécuter des applications avec des arguments de ligne de commande? Sinon, y a-t-il un moyen d'empêcher une session de terminal persistant ou l'icône Applescript de rester ouverts pendant que l'application est ouverte?

Modifier

Selon la page Mozilla Wiki , il est préférable d’utiliser un script pour exécuter l’application avec des arguments. L'ajout d'un & à la fin du script supprime la fenêtre de terminal persistante. Le seul inconvénient, c’est qu’il ouvre une fenêtre de terminal morte et déconnectée (meilleure que la fenêtre persistante, mais quand même ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
59
Andrew

Voici ma meilleure solution: Créer un AppleScript avec:

do Shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

Et enregistrez-le en tant qu'application .

Vous pouvez mettre n'importe quelle application avec n'importe quel argument dans la première partie. La partie après le & doit tuer tout ce que vous avez nommé votre script + .app. L’application de script s’affiche dans le Dock, mais elle disparaîtra.

Remarque: le script ne fonctionnera pas correctement s'il est exécuté à partir de l'éditeur de script, mais uniquement à partir de l'application de script créée.

16
MJeffryes

À partir de OS X 10.6.2, la commande open peut transmettre des arguments à l'application qu'elle ouvre via l'indicateur --args. Un AppleScript à utiliser ressemble à ceci:

do Shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Cela devrait vous donner tout le comportement que vous voulez.

25
Bob

Ouvrez Automator et créez un Application avec un seul Exécuter un script shell action:

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Cette application lancera Firefox et se fermera instantanément, ne laissant que Firefox en cours d'exécution.


Vous pouvez également créer une application à l'aide de Éditeur AppleScript avec le code AppleScript suivant:

do Shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

Les deux fonctionnent correctement et ne maintiennent ni Terminal ni une application de script en cours d'exécution pendant plus d'une seconde environ. En utilisant Automator, vous pouvez même créer un Service si vous le souhaitez.

11
Daniel Beck

Ceci est une vieille discussion, mais revient toujours sur les recherches Google, alors j'ai pensé ajouter quelques ¢.

Il est probablement préférable d'utiliser un "identifiant de paquet" plutôt qu'un chemin absolu vers l'exécutable:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Ou dans un script Apple:

do Shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Ce que je n'ai pas encore compris, c'est comment ouvrir une nouvelle instance/fenêtre avec un profil différent une fois que le premier est déjà ouvert. (Si j'exécute le script AppleScript ci-dessus, puis un autre avec "Profil 2", alors Chrome ouvrira simplement une autre fenêtre sous le nom "Profil 1"). :(

8
user1722483

Il n'est pas nécessaire (comme l'ont suggéré d'autres réponses) d'utiliser killall (ou similaire) de tuer le processus d'application AppleScript parent ("applet") dans ce scénario. Il peut même avoir des effets secondaires indésirables si le nom/modèle donné à killall ne correspond pas seulement au processus de l'applet parent (par exemple, des applications AppleScript exécutant simultanément des applications AppleScript (si vous utilisez «applet» comme modèle)).

Quelque chose comme kill $PPID pourrait être plus raisonnable, mais nous ne voulons peut-être pas supposer que l'applet d'une application AppleScript est toujours le parent immédiat du Shell démarré par do Shell script. Heureusement, il existe un moyen parfaitement raisonnable de faire ce dont vous avez besoin.

Per TN2065 (sous “Je veux démarrer un processus de serveur d'arrière-plan; comment puis-je faire en sorte que le script shell n'attende pas que la commande se termine?”), La méthode appropriée consiste à rediriger stdout et stderr et à laisser le shell exécuter le programme en arrière-plan.

Utilisez Script Editor _ pour enregistrer le programme suivant en tant qu'application AppleScript:

do Shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(Des sauts de ligne fonctionnels ont été ajoutés pour le garder «étroit»; supprimez les ¬ et \\ et mettez le tout sur une longue ligne si vous le souhaitez)

Il fonctionnera suffisamment longtemps pour démarrer Firefox _ et se fermera proprement pendant que Firefox continuera à fonctionner.

La redirection est obligatoire car script shell n'attend pas que son enfant immédiat (le shell) se ferme, mais également (toutes les instances) des extrémités inscriptibles des canaux créés pour le shell. stdout et stderr à fermer. Les programmes qu’il exécute sans redirection héritent des canaux stdout et stderr (script shell du shell) du shell (même ceux exécutés en arrière-plan avec &); la redirection garantit que le shell est le dernier à contenir les extrémités des canaux accessibles en écriture. Ainsi, do shell script retournera immédiatement après la sortie du shell, permettant ainsi à l'application AppleScript de se fermer (puisque le script shell est la dernière expression du programme AppleScript).

Les autres réponses qui utilisent open inside script shell fonctionnent car open (en réalité, LaunchServices) effectue le travail équivalent d'arrière-plan du programme résultant et d'envoi de ses commandes stdout et stderr. autre part.

7
Chris Johnsen

AppleScript

do Shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Deux points là.

  1. L'espace est échappé par une barre oblique inverse qui est échappé par une autre barre oblique inverse
  2. killall applet peut causer des problèmes, car d’autres applets peuvent être exécutées
  3. Enregistrez-le en tant que programme

Cependant cela fonctionne bien sur 10.6.5

4
anonymous

Ce qui suit devrait vous permettre de spécifier des arguments de ligne de commande pour le .app lui-même:

Cliquez avec le bouton droit sur .app bundle, sélectionnez "Afficher le contenu du paquet", accédez à Info.plist, double-cliquez dessus, recherchez la clé Args, puis modifiez-la.

Je n'ai pas de machine OS X à portée de main pour le moment, donc je ne peux pas vérifier si vous pouvez également le faire avec un alias (si vous voulez conserver l'original .app sans argument, etc.).

2
Dav

Enveloppez votre application dans un lanceur AppleScript.

Voici les étapes.

  1. Créez un AppleScript avec le contenu suivant et enregistrez-le en tant qu'application (dans cet exemple, il s'appelle "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do Shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Arrivé à cette application dans le Finder, faites un clic droit dessus, affichez le contenu du paquet.

  3. Placez votre application à la racine du contenu du package. (Dans cet exemple, il s'agirait de "Firefox 3.app")

    Résultat: / Applications/Firefox 3 launcher.app/Firefox 3.app

  4. Vous pouvez maintenant ouvrir votre lanceur d'applications.

Remarques:

  • Les mises à jour automatiques de l'application intégrée devraient fonctionner dans la plupart des cas.
  • Il devrait être possible de faire un glisser-déposer vers le programme de lancement automatiquement redirigé vers l'application encapsulée (avec un peu plus de script).
  • Le lanceur se ferme automatiquement après le lancement de l'application encapsulée.
  • Un avantage de cette méthode est qu’il existe peu de risques d’ouvrir directement l’application encapsulée.
2
jlgrall