web-dev-qa-db-fra.com

Lancer une application sur OS X avec une ligne de commande

Je veux lancer une application sur OSX à partir d'un script. J'ai besoin de passer les arguments en ligne de commande. Malheureusement, open n'accepte pas les arguments en ligne de commande.

La seule option à laquelle je peux penser est d'utiliser Nohup myApp > /dev/null & pour lancer mon application afin qu'elle puisse exister indépendamment du script qui la lance.

De meilleures suggestions?

98
psychotik

Sous OS X 10.6, la commande open a été améliorée pour permettre la transmission d'arguments à l'application:

open ./AppName.app --args -AppCommandLineArg

Mais pour les anciennes versions de Mac OS X, et parce que les bundles d’applications ne sont pas conçus pour passer les arguments en ligne de commande, le mécanisme classique consiste à utiliser Apple Events pour les fichiers tels que ici pour les applications Cocoa ou ici pour les applications Carbon. Vous pouvez aussi probablement faire quelque chose de kludgey en passant des paramètres lors de l'utilisation de variables d'environnement.

65
Ned Deily

Comme mentionné dans la question ici , la commande open dans 10.6 a maintenant un drapeau args, vous pouvez donc appeler:

open -n ./AppName.app --args -AppCommandLineArg

100
John McDonnell

Un ensemble d’applications (un fichier .app) est en réalité un ensemble de répertoires. Au lieu d'utiliser open et le nom .app, vous pouvez y accéder et démarrer le binaire réel. Par exemple:

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

C'est le binaire réel qui pourrait accepter des arguments (ou non, dans le cas de LittleSnapper).

31
NSSec

Si votre application doit travailler sur des fichiers (ce que vous vous attendez normalement à transmettre sous la forme: ./myApp *.jpg), procédez comme suit:

open *.jpg -a myApp
14
eshedg

Je recommanderais la technique proposée par MathieuK. Dans mon cas, je devais l'essayer avec Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

Je réalise que cela ne résout pas le problème du PO, mais j'espère que cela fera gagner du temps à quelqu'un d'autre. :)

4
Paul Irish

À partir de OS X Yosemite , nous pouvons maintenant utiliser AppleScript et Automator pour automatiser des tâches complexes. JavaScript pour l'automatisation peut maintenant être utilisé comme langage de script.

Cette page donne un bon exemple de script qui peut être écrit sur la ligne de commande en utilisant les modes bash et osascript interactive. Il ouvre un onglet Safari et navigue vers example.com.

osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.Push(tab); 
window.currentTab = tab;
2
Mowzer

open a également un indicateur -a, que vous pouvez utiliser pour ouvrir une application à partir du dossier Applications par son nom (ou par l'identificateur de paquet avec l'indicateur -b). Vous pouvez combiner cela avec l'option --args pour obtenir le résultat souhaité:

open -a APP_NAME --args ARGS

Pour ouvrir une vidéo dans un lecteur VLC qui doit évoluer avec un facteur 2x et une boucle, vous devez par exemple exécuter:

open -a VLC --args -L --fullscreen

Notez que je n’ai pas pu obtenir la sortie des commandes vers le terminal. (bien que je n'ai rien essayé pour résoudre ça)

2
rien333

Avec applescript:

tell application "Firefox" to activate
1
Keith

Je souhaitais exécuter deux instances distinctes de Chrome, chacune utilisant son propre profil. Je voulais pouvoir les démarrer à partir de Spotlight , comme je le fais habituellement pour lancer des applications Mac. En d’autres termes, j’avais besoin de deux applications Mac classiques, regChrome pour la navigation normale et altChrome pour utiliser le profil spécial, pour pouvoir démarrer facilement en tapant ⌘-space pour afficher Spotlight, puis 'reg' ou 'alt', puis Entrée.

Je suppose que la méthode la plus brutale pour atteindre l'objectif ci-dessus serait de créer deux copies de l'ensemble d'applications Google Chrome sous les noms respectifs. Mais c'est moche et complique la mise à jour.

Je me suis retrouvé avec deux AppleScript applications contenant chacune deux commandes. Voici celui pour altChrome:

do Shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do Shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

La deuxième ligne démarre Chrome avec le profil alternatif (paramètre --user-data-dir).

La première ligne est une tentative infructueuse de création d'icônes distinctes pour les deux applications. Au début, cela semble bien fonctionner. Cependant, tôt ou tard, Chrome relit son fichier d'icônes et récupère celui qui correspond à la dernière application lancée, ce qui donne deux applications en cours d'exécution avec la même icône. Mais je n'ai pas pris la peine d'essayer de résoudre ce problème - je garde les deux navigateurs sur des bureaux séparés et la navigation entre eux ne pose aucun problème.

1
George

Pourquoi ne pas simplement définir ajouter le chemin d'accès à la corbeille de l'application. Pour MacVim, j'ai fait ce qui suit. 

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

Un alias, est une autre option que j'ai essayée.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

Avec l'export PATH, je peux appeler toutes les commandes de l'application. Les arguments ont bien fonctionné pour mon test avec MacVim. Alors que l'alias, je devais alias chaque commande de la corbeille.

mvim README.txt
gvim Anotherfile.txt

Profitez du pouvoir de alias et de PATH. Cependant, vous devez surveiller les modifications lorsque le système d'exploitation est mis à niveau.

0
zerocog

Simple, remplacez ici "APP" par le nom de l'application que vous souhaitez lancer.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

Merci moi plus tard.

0
Kiran Sk