94 votes

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 kiosque ou pour utiliser un profil différent dans Firefox, je peux taper

$ /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 Macs n'utilisent pas de raccourci en tant que tel et exécutent les applications directement, ce n'est pas possible.

J'ai constaté que le lancement des applications par bash ou Applescript fonctionne 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 les rendre exécutables et leur attribuer une icône et 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, en utilisant la commande Applescript open éviterait cela, mais comme je n'exécute pas l'application telle qu'elle est emballée (juste /Applications/Firefox ), cela ne fonctionne pas.

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

Modifier

Selon un Page Wiki de Mozilla 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 tue la fenêtre persistante du Terminal. Le seul inconvénient maintenant est qu'il ouvre une fenêtre de Terminal morte et déconnectée (ce qui est mieux que la fenêtre persistante, mais quand même...).

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

46voto

Milo Points 161

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

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

Cela devrait vous donner le comportement que vous souhaitez.

24voto

Jim Fiorato Points 1826

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 l'enregistrer en tant qu'application .

Vous pouvez mettre n'importe quelle application avec n'importe quels arguments dans la première partie. La partie après le & doit tuer ce que vous avez appelé votre script + .app. Vous verrez l'application script clignoter dans le dock, mais elle disparaîtra ensuite.

Remarque : Le script ne fonctionnera pas correctement lorsqu'il sera exécuté à partir de l'éditeur script, seulement lorsqu'il sera exécuté à partir de l'application script que vous avez créée.

24voto

Daniel Beck Points 105590

Ouvrir Automator et créer un Application avec un seul Exécuter Shell Shell action :

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

Cette application lancera Firefox et quittera instantanément, ne laissant que Firefox en fonctionnement.


Vous pouvez également créer une application en utilisant Éditeur AppleScript avec le code AppleScript suivant :

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

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

18voto

ecnepsnai Points 536

El open a une option --args dont la valeur sera transmise à l'application ouverte en tant qu'arguments. Par exemple :

open /Applications/TextEdit.app --args example.txt

10voto

Chris Johnsen Points 36743

Il n'est pas nécessaire (comme certaines autres réponses l'ont suggéré) d'utiliser la fonction killall (ou similaire) pour tuer le processus d'application AppleScript parent ("applet") dans ce scénario. Cela peut même avoir des effets secondaires fâcheux si le nom/modèle donné à killall ne correspond pas seulement au processus de l'applet parent (par exemple, d'autres applications AppleScript fonctionnant simultanément (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 de la Shell démarrée par do Shell Shell . Heureusement, il existe un moyen parfaitement raisonnable de faire ce dont vous avez besoin.

Par TN2065 (sous "Je veux lancer un processus serveur en arrière-plan ; comment faire pour que le Shell Shell n'attende pas que la commande soit terminée ?"), la bonne méthode consiste à rediriger stdout et stderr et à faire en sorte que le Shell exécute le programme en arrière-plan.

Utilisez scriptÉditeur pour enregistrer le programme suivant comme une 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 que le texte reste "étroit" ; supprimer l'élément suivant <code>¬</code> y <code>\</code> et mettez tout sur une longue ligne si vous voulez)

Il fonctionnera assez longtemps pour démarrer Firefox et se terminera proprement alors que Firefox continue à fonctionner.

La redirection est nécessaire car non seulement do Shell Shell attend que son enfant immédiat (le Shell) sorte, mais il attend aussi que (toutes les instances de) les extrémités accessibles en écriture des tuyaux qu'il crée pour les stdout et stderr du Shell soient fermées. Le stdout et le stderr du Shell ( do Shell Shell ) sont hérités par les programmes qu'il exécute sans redirection (même ceux exécutés en arrière-plan avec la commande & ) ; la redirection assure que le Shell est le dernier à détenir les extrémités inscriptibles des tuyaux. Ainsi , do Shell Shell reviendra immédiatement après la sortie du Shell, permettant ainsi à l'application AppleScript elle-même de sortir (puisque l'option do Shell Shell est la dernière expression du programme AppleScript).

Les autres réponses qui utilisent ouvrir à l'intérieur de do Shell Shell travailler parce que ouvrir (en fait LaunchServices) fait le travail équivalent en mettant en arrière-plan le programme résultant et en envoyant ses stdout et stderr ailleurs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X