Starten Sie eine App unter OS X mit der Befehlszeile

108

Ich möchte eine App unter OSX über ein Skript starten. Ich muss es Befehlszeilenargumente übergeben. openAkzeptiert leider keine Befehlszeilenargumente.

Die einzige Option, die mir in den Sinn kommt, ist nohup myApp > /dev/null &das Starten meiner App, damit sie unabhängig von dem Skript existiert , mit dem sie gestartet wird.

Irgendwelche besseren Vorschläge?

Psychotik
quelle
Ich kann der Frage nicht folgen. "open" akzeptiert keine Befehlszeilenargumente? Was ist "offen"? Ist das das AppleScript offen? Wie löst nohup &man das Problem?
S.Lott
4
man open (1) - OS X-Befehl zum Starten von Dateien oder Apps
Ned Deily
3
Dies sollte auf superuser.com sein
Jeff Meatball Yang

Antworten:

78

In OS X 10.6 wurde der openBefehl erweitert, um die Übergabe von Argumenten an die Anwendung zu ermöglichen:

open ./AppName.app --args -AppCommandLineArg

Für ältere Versionen von Mac OS X und da App-Bundles nicht für die Übergabe von Befehlszeilenargumenten ausgelegt sind, besteht der herkömmliche Mechanismus darin, Apple Events für Dateien wie hier für Cocoa-Apps oder hier für Carbon-Apps zu verwenden. Sie könnten wahrscheinlich auch etwas Kludgey tun, indem Sie Parameter bei der Verwendung von Umgebungsvariablen übergeben.

Ned Deily
quelle
Mein kludgey-Ansatz besteht darin, die ausführbare Datei direkt mit Befehlszeilenargumenten unter Verwendung von nohup aufzurufen - wenn die Umgebung-vars-kludge weniger kludgey ist?
Psychotik
2
Wahrscheinlich nicht. Wenn es für Sie funktioniert, machen Sie mit. Der größere Punkt ist, dass open (1) das CLI-Äquivalent zu dem ist, was passiert, wenn ein Benutzer einen Doppelklick oder ein "Open" im Finder ausführt und keiner dieser Mechanismen herkömmliche Befehlszeilenargumente unterstützt.
Ned Deily
+1: Sie sollten keine Befehlszeilenargumente für Mac OS X-GUI-Anwendungen verwenden.
S.Lott
2
Weisen Sie Google an, keine Befehlszeilenargumente zu verwenden. 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. "Warum?" Hast du die Antwort gelesen? "Der herkömmliche Mechanismus besteht darin, Apple Events für Dateien wie hier für Cocoa-Apps oder hier für Carbon-Apps zu verwenden." So ist Mac OS X konzipiert. Ja. Chrome verstößt gegen die Regeln. Dies gilt auch für jedes einzelne Linux-Befehlszeilenprogramm. Die GUI-Anwendungen, mit denen geöffnet wird, opensind jedoch - wie in der Antwort angegeben - nicht für die Arbeit über die Befehlszeile ausgelegt. "Warum?" Denn so ist Mac OS X.
S.Lott
105

Wie in der Frage hier erwähnt , hat der openBefehl in 10.6 jetzt ein argsFlag, sodass Sie Folgendes aufrufen können:

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

John McDonnell
quelle
Genau so arbeiten, wie es erforderlich war. Vielen Dank
DTdev
Dies funktionierte und erlaubte mir, einen zsh-Alias ​​für Chromium festzulegen. Dank
jamescampbell
Diese Antwort ist großartig. Ich wollte nur hinzufügen, dass Sie sich beim ersten Öffnen von Terminal in Ihrem Ausgangsverzeichnis befinden. Geben Sie es also so ein, damit Sie nicht in das Anwendungsverzeichnis wechseln müssen. Ich wollte Gimp ausführen, ohne die Schriftarten zu laden, was ewig dauert. Deshalb tippe ich dies mit dem Schalter -f ein, um die Schriftarten wegzulassen: open -n /Applications/GIMP.app --args -f
James Toomey
32

Ein Anwendungspaket (eine .appDatei) besteht aus mehreren Verzeichnissen. Anstatt openund den .appNamen zu verwenden, können Sie tatsächlich darauf zugreifen und die eigentliche Binärdatei starten. Zum Beispiel:

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

Dies ist die eigentliche Binärdatei, die möglicherweise Argumente akzeptiert (oder auch nicht LittleSnapper).

NSSec
quelle
3
Die Binärdatei akzeptiert Argumente, da bin ich mir sicher. Ich schrieb es. Das Aufrufen von 'open' erlaubt keine Übergabe von Argumenten. Da bin ich mir ziemlich sicher. Und ja, mein Skript ruft direkt 'open binary' auf und versucht nicht, das Bundle zu öffnen.
Psychotik
@psychotik: Er sagt nicht, dass er "offene Binärdatei" nennen soll. Er sagt, er soll die Binärdatei direkt ausführen.
Chuck
Das wird bei mir nicht funktionieren. Das direkte Ausführen der Binärdatei führt dazu, dass es sich um einen untergeordneten Prozess meines Skripts handelt, den ich definitiv nicht möchte. Daher die Notwendigkeit, open / nohup
psychotik
1
Wenn es sich um ein Shell-Skript handelt, verwenden Sie 'exec', um den Skriptprozess durch die tatsächliche ausführbare Datei zu ersetzen.
Jonathan Leffler
2
Dieser Ansatz hat einen großen Nachteil: Wenn das Bundle benutzerdefinierte Bibliotheken und Frameworks enthält, müssen Sie mit DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
Ulidtko
14

Wenn Ihre App an Dateien arbeiten muss (was Sie normalerweise als :) erwarten ./myApp *.jpgwürden, gehen Sie folgendermaßen vor:

open *.jpg -a myApp
eshedg
quelle
Dieser ist genau das, wonach ich gesucht habe! Meine Instanziierung zum Beispiel: open something.py -a Eclipse.app
Eric
4

Ich würde die Technik empfehlen, die MathieuK anbietet. In meinem Fall musste ich es mit Chromium versuchen:

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

Mir ist klar, dass dies das Problem des OP nicht löst, aber hoffentlich die Zeit eines anderen spart. :) :)

Paul Irish
quelle
@Pacerier Fügen Sie am Ende dieses Befehls ein "&" hinzu. Es wird im Hintergrund gestartet. Sie können dann Ihr Terminalfenster schließen und die Anwendung bleibt wahrscheinlich weiterhin geöffnet.
Paul Irish
2

openhat auch ein -a-Flag, mit dem Sie eine App aus dem Ordner "Programme" anhand ihres Namens (oder anhand der Bundle-ID mit dem Flag -b) öffnen können. Sie können dies mit der Option --args kombinieren, um das gewünschte Ergebnis zu erzielen:

open -a APP_NAME --args ARGS

Um ein Video im VLC-Player zu öffnen, das mit einem Faktor 2x und einer Schleife skaliert werden soll, führen Sie beispielsweise Folgendes aus:

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

Beachten Sie, dass ich die Ausgabe der Befehle nicht an das Terminal senden konnte. (obwohl ich nichts versucht habe, um das zu lösen)

rien333
quelle
Hast du das open -aabsichtlich wiederholt ? Auf jeden Fall open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllfunktioniert das bei mir nicht.
Pacerier
Verzeihung, meine Syntax ist aus irgendeinem Grund völlig falsch. Ich werde jetzt aktualisieren.
Rien333
2

Ich wollte zwei separate Instanzen von Chrome ausführen, die jeweils ein eigenes Profil verwenden. Ich wollte sie von Spotlight aus starten können , wie es meine Gewohnheit ist, Mac-Apps zu starten . Mit anderen Worten, ich brauchte zwei normale Mac-Anwendungen, regChromeum normal zu surfen und altChromedas spezielle Profil zu verwenden, um einfach durch Drücken von ⌘-Leertaste zum Aufrufen von Spotlight, dann 'reg' oder 'alt' und dann Enter zu starten.

Ich nehme an, der Brute-Force-Weg, um das oben genannte Ziel zu erreichen, besteht darin, zwei Kopien des Google Chrome-Anwendungspakets unter den jeweiligen Namen zu erstellen. Aber das ist hässlich und erschwert die Aktualisierung.

Am Ende hatte ich zwei AppleScript- Anwendungen mit jeweils zwei Befehlen. Hier ist der für 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 &"

In der zweiten Zeile wird Chrome mit dem alternativen Profil (dem --user-data-dirParameter) gestartet.

Die erste Zeile ist ein erfolgloser Versuch, den beiden Anwendungen unterschiedliche Symbole zuzuweisen. Zunächst scheint es gut zu funktionieren. Früher oder später liest Chrome jedoch seine Symboldatei erneut und ruft diejenige ab, die der zuletzt gestarteten der beiden Apps entspricht. Dies führt dazu, dass zwei Anwendungen mit demselben Symbol ausgeführt werden. Aber ich habe mich nicht darum gekümmert, das Problem zu beheben. Ich behalte die beiden Browser auf separaten Desktops, und das Navigieren zwischen ihnen war kein Problem.

George
quelle
2

Beginnend mit OS X Yosemite können wir jetzt AppleScript und Automator verwenden, um komplexe Aufgaben zu automatisieren. JavaScript für die Automatisierung kann jetzt als Skriptsprache verwendet werden.

Diese Seite enthält ein gutes Beispielskript , das im interaktiven Bash- und Osascript- Modus über die Befehlszeile geschrieben werden kann . Es öffnet eine Safari-Registerkarte und navigiert zu 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;
Mäher
quelle
Unter Skripteditor / Fenster / Bibliothek finden Sie eine Liste der Apps, für die Applescript-Automatisierung verfügbar ist. Ich habe nach Vysor gesucht, das auf Chrome basiert, und ich denke, ich brauche einen anderen Weg.
AnneTheAgile
Mehr Komplexität ftw!
Pacerier
1

Mit Applescript:

tell application "Firefox" to activate
Keith
quelle
Wie übergeben Sie Argumente an Firefox? ZB -no-remote -P "Ein anderes Profil". Bei der Entwicklung von Add-Ons und dergleichen ist es zweckmäßig, zwei separate Firefox-Prozesse mit zwei separaten Profilen zu verwenden. Ihr normales Profil und eine Sandbox, in der Sie Ihre Erweiterung debuggen können.
George
Ich glaube, Sie beziehen sich auf eine AppleScript-Direktive, aber die Frage
betrifft das
0

Warum nicht einfach den Pfad zum Bin der App hinzufügen? Für MacVim habe ich Folgendes getan.

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

Ein Alias ​​ist eine weitere Option, die ich ausprobiert habe.

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

Mit dem Exportpfad kann ich alle Befehle in der App aufrufen. Die Argumente für meinen Test mit MacVim haben sich gut bewährt. Während der Alias, musste ich jeden Befehl in der Bin alias.

mvim README.txt
gvim Anotherfile.txt

Genieße die Kraft von Alias ​​und PATH. Sie müssen jedoch Änderungen überwachen, wenn das Betriebssystem aktualisiert wird.

Nullocog
quelle
"Denken Sie daran, MacOS ist Linux-basiert". Nein, nein, MacOS und Linux teilen sich keine einzige Codezeile. MacOS ist ein UNIX mit einem auf FreeBSD basierenden Kernel.
Thomas
Wird sich verändern. Ich möchte keinen religiösen Krieg führen. Ziel war es, die Community über einige leistungsstarke Optionen zu informieren, die MacOS-Benutzer nutzen können.
Zerocog
Sicher kein Problem! :)
Thomas
0

Einfach, hier ersetzen Sie die "APP" durch den Namen der App, die Sie starten möchten.

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

Danke mir später.

Kiran Sk
quelle
0

Sie können Apps starten mit open:

open -a APP_YOU_WANT

Dies sollte die gewünschte Anwendung öffnen.

Benutzer13549667
quelle