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

60

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 tant que tel 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 assigner 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éviterait cela, mais comme je n'exécute pas l'application telle qu'elle est empaquetée (juste /Applications/Firefox), cela 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 une icône Applescript de rester ouverte pendant que l'application est ouverte?

Modifier

Selon une page Wiki de Mozilla , il est préférable d’utiliser un script pour exécuter l’application avec des arguments. Ajouter 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 celle persistante, mais quand même ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
Andrew
la source
2
J'espère toujours avoir de meilleures réponses à ce sujet ...
cregox
Lorsque vous exécutez un travail &qui appartient toujours au terminal, vous pouvez résoudre ce problème en ajoutant la ligne disown %/Applications/Firefox.app/Contents/MacOS/firefox après l'avoir exécuté, puis vous pouvez fermer le terminal en toute sécurité à l'aide d'AppleScript.
jeudi
cherchez la réponse de Daniel - c'est la plus complète et la plus parfaite pour aujourd'hui (OSX 10.6.2 +).
cregox

Réponses:

17

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 &besoin de 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.

MJeffryes
la source
Ça marche presque. Nous attendons toujours que l'instance de Firefox soit terminée jusqu'à ce qu'elle exécute killall. Elle appelle donc le débogueur lorsque je ferme Firefox, et l'application de script ne disparaît toujours pas. Hmmm ...
Andrew
C'est bizarre. Enregistrez-vous comme une application, puis double-cliquez sur l'application? Cela ne fonctionnera pas s'il est exécuté depuis l'éditeur de script.
MJeffryes
De plus, je remarque que je mets une nouvelle ligne avant le &. Supprimez la nouvelle ligne si vous en avez un
MJeffryes
pas besoin de & killall ici à Snow Leopard 10.6.x - mais n'a également pas trouvé le moyen de faire en sorte que l'application se tue elle-même dès l'exécution.
cregox
1
@Pacerier Vérifiez les dates sur cette réponse.
MJeffryes
28

À 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.

Bob
la source
"homme ouvert", et le voilà! travaillé comme un charme. --args flag et ensuite vos arguments.
Michael Dimmitt
1
J'ai essayé --argsavec Chrome et ça ne marche pas. Cela ne fonctionnera que pour la première instance . Si vous essayez d'exécuter deux --user-data-dirlogiciels simultanément, vous ne pouvez pas le faire, openmais vous devez l'exécuter avec l'ancienne /applications...méthode. Quelqu'un sait pourquoi la baise ne --args fonctionne pas?
Pacerier
1
@Pacerier, "open -n"
Simon Wright
Pour ajouter à cela, vous pouvez créer le script dans Script Editor, puis l’enregistrer en tant qu’application.
Kevin C.
11

Ouvrez Automator et créez une application avec une seule action Exécuter un script shell :

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

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


Vous pouvez également créer une application à l'aide de l' é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 gardent 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.

Daniel Beck
la source
1
Gardez juste à l’esprit que la version open --args10.6.2 a été implémentée, comme Bob l’a déjà mentionné.
cregox
Utilisation pour: open eclipse.app -nouvrir un deuxième espace de travail Eclipse. Très utile. Merci!
Jonalv
Impossible de le faire fonctionner dans Automator avec l’action "Run Shell Script" dans MacOS 10.14. J'ai fini par avoir du succès avec le AppleScript, cependant.
Kevin C.
8

Ceci est une vieille discussion, mais revient toujours sur les recherches sur 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 je lance le script AppleScript ci-dessus, puis un autre avec "Profil 2", alors Chrome ouvrira toujours une autre fenêtre sous le nom "Profil 1"). :(

utilisateur1722483
la source
Est-ce que -b est fonctionnellement égal à -a? Comment sont-ils différents?
Pacerier
7

Comme il a été suggéré dans d'autres réponses, il n'est pas nécessaire d'utiliser killall (ou similaire) pour 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 uniquement au processus d'applet parent (par exemple, d'autres applications AppleScript exécutant simultanément des applications AppleScript (si vous utilisez «applet» comme modèle)).

Quelque chose de semblable kill $PPIDpourrait ê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 script shell . Heureusement, il existe un moyen parfaitement raisonnable de faire ce dont vous avez besoin.

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

Utilisez l' éditeur de script 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 &"

(sauts de ligne fonctionnelle ajoutée pour le garder « réduire », supprimer le ¬et \\et le mettre sur une seule ligne de temps si vous le souhaitez)

Il fonctionnera suffisamment longtemps pour démarrer Firefox et se fermera proprement pendant que Firefox continue de fonctionner.

La redirection est obligatoire car non seulement le script shell attend la fin de son enfant immédiat (le shell), mais il attend également (toutes les instances de) les extrémités inscriptibles des tuyaux qu'il crée pour que stdout et stderr du shell soient fermés. . Les commandes stdout et stderr du shell (les tubes du script shell ) sont héritées par les programmes qu’il exécute sans redirection (même ceux exécutés en arrière-plan &); la redirection garantit que le shell est le dernier à contenir les extrémités inscriptibles des tuyaux. Ainsi, le script shell retourne immédiatement après la fermeture du shell, ce qui permet à l'application AppleScript de se fermer (car le script shell est la dernière expression du programme AppleScript).

Les autres réponses qui utilisent open à l' intérieur du script shell fonctionnent car open (en réalité, LaunchServices) effectue un travail équivalent en mettant en arrière-plan le programme résultant et en envoyant ses commandes stdout et stderr ailleurs.

Chris Johnsen
la source
c'est très intéressant. Je me demande si cela fonctionne avant 10.6.2 ... mais je pense toujours que l’utilisation de l’ open --argsapparence est plus propre. y a-t-il des inconvénients à en utiliser?
cregox
1
Je sais que cette méthode fonctionne en 10.4. Mon impression est que le script shell a toujours fonctionné de la sorte (il a été ajouté à OSAX Standard Additions dans AppleScript 1.7 , fourni avec Mac OS X 10.1). Si vous êtes prêt à assumer 10.6, alors open --argsc'est probablement bien.
Chris Johnsen
@ChrisJohnsen, Link down ........
Pacerier
4

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 la barre oblique inverse à nouveau
  2. killall applet peut causer des problèmes, car d’autres applets en cours
  3. Enregistrez-le en tant que programme

Cependant cela fonctionne bien sur 10.6.5

anonyme
la source
appletfait référence à?
Pacerier
3

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 vouliez conserver le fichier .app original sans argument, etc.).

Dav
la source
Il n'y a malheureusement pas de clé args dans le plist. Selon Mozilla, vous êtes censé utiliser un script - wiki.mozilla.org/MailNews:Logging#Mac
Andrew
Notez également que la modification du contenu d'un package (tel que Info.plist) peut entraîner des problèmes de signature de code: bridge.grumpy-troll.org/2011/01/…
drevicko
2

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 d’effectuer 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.
jlgrall
la source
1

Pourquoi n'utilisez-vous pas:

#!/bin/sh
open /Applications/Firefox.app

Simple mais ça marche.


la source
2
Le terminal s'ouvrira si vous faites cela.
MJeffryes
0

La opencommande a un --argsargument optionnel qui valeur sera transmis à l'application ouverte en tant qu'arguments. Par exemple:

open /Applications/TextEdit.app --args example.txt
ecnepsnai
la source