Lancer une application sous OS X avec la ligne de commande

109

Je souhaite lancer une application sur OSX à partir d'un script. J'ai besoin de lui transmettre des arguments de ligne de commande. Malheureusement, openn'accepte pas les arguments de 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?

psychotik
la source
Je ne peux pas suivre la question. "open" n'accepte pas les arguments de ligne de commande? Qu'est-ce que «ouvert»? Est-ce l'AppleScript ouvert? Comment nohup &résout le problème?
S.Lott
4
man open (1) - Commande OS X pour lancer des fichiers ou des applications
Ned Deily
3
Cela devrait être sur superuser.com
Jeff Meatball Yang

Réponses:

78

Sous OS X 10.6, la opencommande a été améliorée pour permettre le passage d'arguments à l'application:

open ./AppName.app --args -AppCommandLineArg

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

Ned Deily
la source
Mon approche kludgey consiste à appeler l'exécutable directement avec la ligne de commande args en utilisant nohup - si l'environnement-vars-kludge less kludgey?
psychotik
2
Probablement pas. Si cela fonctionne pour vous, allez-y. Le point le plus important est que open (1) est l'équivalent cli de ce qui se passe lorsqu'un utilisateur fait un double-clic ou un "Open" dans le Finder et qu'aucun de ces mécanismes ne prend en charge les arguments de ligne de commande conventionnels.
Ned Deily
+1: Vous ne devriez pas utiliser d'arguments de ligne de commande pour les applications GUI Mac OS X.
S.Lott
2
dites à Google de ne pas utiliser les arguments de ligne de commande, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal
@Anurag Uniyal. "Pourquoi?" Avez-vous lu la réponse? "Le mécanisme conventionnel consiste à utiliser Apple Events pour des fichiers comme ici pour les applications Cocoa ou ici pour les applications Carbon." C'est ainsi que Mac OS X est conçu. Oui. Chrome enfreint les règles. Il en va de même pour chacun des utilitaires de ligne de commande Linux. Mais les applications GUI qui sont ouvertes avec ne opensont - comme le dit la réponse - pas conçues pour fonctionner à partir de la ligne de commande. "Pourquoi?" Parce que c'est comme ça que Mac OS X est.
S.Lott
105

Comme mentionné dans la question ici , la opencommande dans 10.6 a maintenant un argsdrapeau, vous pouvez donc appeler:

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

John McDonnell
la source
Travailler exactement comme il le fallait. Merci
DTdev
Cela a fonctionné et m'a permis de définir un alias zsh pour Chromium. Merci
jamescampbell
Cette réponse est excellente. Je voulais juste ajouter que lorsque vous ouvrirez Terminal pour la première fois, vous serez dans votre répertoire personnel, alors tapez-le de cette façon afin que vous n'ayez pas besoin de basculer vers le répertoire Application. Je voulais exécuter Gimp sans charger les polices, ce qui prend une éternité, alors je tape ceci avec le commutateur -f pour omettre les polices: open -n /Applications/GIMP.app --args -f
James Toomey
32

Un ensemble d'applications (un .appfichier) est en fait un ensemble de répertoires. Au lieu d'utiliser openet le .appnom, vous pouvez réellement 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 LittleSnapperle cas de).

NSSec
la source
3
Le binaire accepte les arguments, j'en suis sûr. Je l'ai écrit. Invoquer «open» ne permet pas de passer des arguments. J'en suis presque sûr. Et oui, mon script appelle directement 'open binary', sans essayer d'ouvrir le bundle.
psychotik
@psychotik: Il ne dit pas d'appeler "binaire ouvert". Il dit d'exécuter directement le binaire.
Chuck
Cela ne fonctionnera pas pour moi. L'exécution directe du binaire en fait un processus enfant de mon script, ce que je ne veux absolument pas. D'où la nécessité d'utiliser open / nohup
psychotik
1
S'il s'agit d'un script shell, utilisez 'exec' pour remplacer le processus de script par l'exécutable réel.
Jonathan Leffler
2
Cette approche présente un inconvénient majeur: si le paquet contient des bibliothèques personnalisées et des cadres, vous aurez besoin de jouer avec DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

Dans le cas où votre application doit fonctionner sur des fichiers (ce que vous attendez normalement de passer comme:) ./myApp *.jpg, vous le feriez comme ceci:

open *.jpg -a myApp
eshedg
la source
Celui-ci est exactement ce que je cherchais! Mon instanciation, par exemple: open something.py -a Eclipse.app
Eric
4

Je recommanderais la technique que propose MathieuK. Dans mon cas, j'avais besoin de l'essayer avec Chromium:

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

Je me rends compte 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. :)

Paul irlandais
la source
@Pacerier Ajoutez un `&` à la fin de cette commande. Il se lancera en arrière-plan. Vous pouvez ensuite fermer la fenêtre de votre terminal et l'application restera probablement toujours ouverte.
Paul Irish
2

opena également un indicateur -a, que vous pouvez utiliser pour ouvrir une application à partir du dossier Applications par son nom (ou par identifiant de bundle 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 le lecteur VLC qui doit être mise à l'échelle avec un facteur 2x et en 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. (même si je n'ai rien essayé pour résoudre ça)

rien333
la source
Avez-vous répété open -aintentionnellement ?? En tout cas, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllça ne marche pas pour moi.
Pacerier
Pardonnez-moi, ma syntaxe est complètement désactivée pour une raison quelconque. Je vais mettre à jour maintenant.
rien333
2

Je voulais que deux instances distinctes de Chrome soient exécutées, chacune utilisant son propre profil. Je voulais pouvoir les démarrer à partir de Spotlight , comme c'est mon habitude de démarrer des applications Mac. En d'autres termes, j'avais besoin de deux applications Mac régulières, regChromepour la navigation normale et altChromepour utiliser le profil spécial, pour être facilement démarré en tapant ⌘-espace pour afficher Spotlight, puis 'reg' ou 'alt', puis Entrée.

Je suppose que le moyen par force brute d'atteindre l'objectif ci-dessus serait de faire deux copies du bundle d'applications Google Chrome sous les noms respectifs. Mais c'est moche et complique la mise à jour.

Je me suis retrouvé avec deux applications AppleScript 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 commence Chrome avec le profil alternatif (le --user-data-dirparamètre).

La première ligne est une tentative infructueuse de donner aux deux applications des icônes distinctes. Au départ, cela semble fonctionner correctement. Cependant, tôt ou tard, Chrome relit son fichier d'icône et obtient celui correspondant à la dernière des deux applications qui a été démarrée en dernier, ce qui entraîne deux applications en cours d'exécution avec la même icône. Mais je n'ai pas pris la peine d'essayer de le réparer - je garde les deux navigateurs sur des bureaux séparés et la navigation entre eux n'a pas posé de problème.

George
la source
2

À partir d' OS X Yosemite , nous pouvons désormais utiliser AppleScript et Automator pour automatiser des tâches complexes. JavaScript pour l'automatisation peut désormais ê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 le mode interactif bash et osascript . Il ouvre un onglet Safari et accède à example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
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;
Mowzer
la source
Vérifiez Script Editor / Window / Library pour une liste des applications qui ont l'automatisation applescript disponible. Je cherchais Vysor, basé sur Chrome, et je pense que j'ai besoin d'une manière différente.
AnneTheAgile
Plus de complexité ftw!
Pacerier
1

Avec applescript:

tell application "Firefox" to activate
Keith
la source
Comment passez-vous des arguments à Firefox? Par exemple, -no-remote -P "Un autre profil". Lors du développement d'add-ons et autres, il est pratique d'avoir deux processus Firefox distincts en utilisant deux profils distincts. Votre profil normal et un bac à sable dans lequel déboguer votre extension.
George
Je crois que vous faites référence à une directive AppleScript, mais la question concerne l'ouverture à partir de la ligne de commande ...
Conny
0

Pourquoi ne pas simplement définir ajouter un chemin vers 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 le PATH d'exportation, je peux appeler toutes les commandes de l'application. Les arguments ont bien passé pour mon test avec MacVim. Alors que l'alias, je devais alias chaque commande dans le bac.

mvim README.txt
gvim Anotherfile.txt

Profitez de la puissance d'alias et de PATH. Cependant, vous devez surveiller les modifications lors de la mise à niveau du système d'exploitation.

zerocog
la source
"Souvenez-vous que MacOS est basé sur Linux". Non, non, macOS et Linux ne partagent pas une seule ligne de code. MacOS est un UNIX avec un noyau basé sur FreeBSD.
Thomas
Changera. Je ne veux pas créer une guerre de religion. L'objectif était de faire savoir à la communauté qu'il existe des options puissantes que les utilisateurs de MacOS peuvent utiliser.
zerocog
Bien sûr pas de problème! :)
Thomas
0

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 plus tard.

Kiran Sk
la source
0

Vous pouvez lancer des applications en utilisant open:

open -a APP_YOU_WANT

Cela devrait ouvrir l'application souhaitée.

user13549667
la source