webentwicklung-frage-antwort-db.com.de

Starten Sie eine App unter OS X mit der Befehlszeile

Ich möchte eine App unter OSX über ein Skript starten. Ich muss Kommandozeilenargumente übergeben. Leider akzeptiert open keine Befehlszeilenargumente.

Die einzige Option, die ich mir vorstellen kann, ist, Nohup myApp > /dev/null & zum Starten meiner App zu verwenden, sodass sie unabhängig vom Skript, das sie startet, existieren kann.

Irgendwelche besseren Vorschläge?

98
psychotik

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

open ./AppName.app --args -AppCommandLineArg

Bei älteren Versionen von Mac OS X und da App-Bundles nicht für die Übergabe von Befehlszeilenargumenten entwickelt wurden, ist der herkömmliche Mechanismus die Verwendung von Apple Events für Dateien wie here für Cocoa-Apps oder hier für Carbon-Apps. Sie können wahrscheinlich auch etwas kludgey machen, indem Sie Parameter in Umgebungsvariablen übergeben.

65
Ned Deily

Wie in der Frage hier erwähnt, hat der Befehl open in 10.6 jetzt ein args-Flag. Sie können also Folgendes aufrufen:

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

100
John McDonnell

Ein Anwendungspaket (eine .app-Datei) ist eigentlich eine Reihe von Verzeichnissen. Anstatt open und den .app-Namen zu verwenden, können Sie tatsächlich hineingehen und die tatsächliche Binärdatei starten. Zum Beispiel:

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

Dies ist die tatsächliche Binärdatei, die Argumente akzeptieren kann (oder nicht, im Fall von LittleSnapper).

31
NSSec

Für den Fall, dass Ihre App an Dateien arbeiten muss (was Sie normalerweise als ./myApp *.jpg übergeben würden), würden Sie Folgendes tun:

open *.jpg -a myApp
14
eshedg

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 OP-Problem nicht löst, aber hoffentlich spart es Zeit für andere. :)

4
Paul Irish

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 in der Befehlszeile mit dem interaktiven Modus bash und osascript geschrieben werden kann. Es öffnet sich eine Safari-Registerkarte und navigiert zu 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 verfügt auch über die Markierung -a, mit der Sie eine App im Anwendungsordner nach Namen (oder nach Paketkennung mit der Markierung -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 von 2x skaliert werden sollte, sollten Sie beispielsweise Folgendes ausführen:

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

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

2
rien333

Mit Apfelskript:

tell application "Firefox" to activate
1
Keith

Ich wollte zwei separate Instanzen von Chrome ausführen, von denen jede ein eigenes Profil verwendet. Ich wollte sie von Spotlight starten können, wie ich es gewohnt bin, Mac-Apps zu starten. Mit anderen Worten, ich brauchte zwei normale Mac-Anwendungen, regChrome für das normale Browsen und altChrome, um das spezielle Profil zu verwenden, um einfach gestartet zu werden, indem Sie ⌘-space eingeben, um Spotlight aufzurufen.

Ich gehe davon aus, dass der brutale Weg, um dieses Ziel zu erreichen, darin besteht, zwei Kopien des Google Chrome-Anwendungspakets unter den entsprechenden Namen zu erstellen. Das ist aber hässlich und kompliziert das Update.

Am Ende habe ich zwei AppleScript -Anwendungen mit jeweils zwei Befehlen erhalten. Hier ist die 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 &"

Die zweite Zeile startet Chrome mit dem alternativen Profil (dem Parameter --user-data-dir).

Die erste Zeile ist ein erfolgloser Versuch, den beiden Anwendungen unterschiedliche Symbole zu geben. Anfangs scheint es gut zu funktionieren. Früher oder später ruft Chrome jedoch seine Symboldatei erneut ab und erhält die entsprechende Datei, die der jeweils zuletzt gestarteten App entspricht. Dies führt dazu, dass zwei Anwendungen mit demselben Symbol ausgeführt werden. Ich habe mir jedoch nicht die Mühe gemacht, das Problem zu beheben. Ich behalte die beiden Browser auf separaten Desktops und die Navigation zwischen ihnen war kein Problem.

1
George

Warum setzen Sie 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 andere Option, die ich versucht habe.

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

Mit dem Export PATH kann ich alle Befehle in der App aufrufen. Argumente bestanden für meinen Test mit MacVim gut. Während der Alias, musste ich jeden Befehl im Bin Alias.

mvim README.txt
gvim Anotherfile.txt

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

0
zerocog

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.

0
Kiran Sk