it-swarm.com.de

Wie kann ich eine Anwendung mit Befehlszeilenargumenten unter Mac OS ausführen?

Gibt es eine einfache Möglichkeit, Befehlszeilenargumente an eine Anwendung auf einem Mac anzuhängen? Um beispielsweise Opera im Kiosk-Modus auszuführen oder ein anderes Profil in Firefox zu verwenden, kann ich Folgendes eingeben

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

In Windows kann ich die Argumente an die Verknüpfungseigenschaften anhängen, aber da Macs die Verknüpfung nicht per se verwenden und die Anwendungen direkt ausführen, ist dies nicht möglich.

Ich habe festgestellt, dass das Starten der Anwendungen über Bash oder Applescript teilweise funktioniert:

# 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"

Ich kann diese ausführbar machen und ein Symbol zuweisen, und alles funktioniert einwandfrei, außer dass beim Ausführen eines dieser Pseudoprogramme entweder ein Terminalfenster oder ein Applescript-Symbol geöffnet bleibt, solange die Anwendung geöffnet ist. Vermutlich würde die Verwendung des Applescript-Befehls open dies vermeiden, aber da ich die Anwendung nicht so ausführe, wie sie gepackt ist (nur /Applications/Firefox), funktioniert sie nicht.

Gibt es eine bessere Möglichkeit, Anwendungen mit Befehlszeilenargumenten auszuführen? Wenn nicht, gibt es eine Möglichkeit zu verhindern, dass eine permanente Terminalsitzung oder ein Applescript-Symbol geöffnet bleibt, während die Anwendung geöffnet ist?

Bearbeiten

Laut einer Mozilla-Wiki-Seite ist es am besten, ein Skript zu verwenden, um die Anwendung mit Argumenten auszuführen. Durch Hinzufügen eines & am Ende des Skripts wird das beständige Terminalfenster beendet. Das einzige Ärgernis ist jetzt, dass es ein totes, ausgeloggtes Terminalfenster öffnet (das besser ist als das andauernde, aber immer noch ...)

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

Hier ist meine beste Lösung: Erstellen Sie ein Applescript mit:

do Shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

Und als Anwendung speichern .

Sie können jede Anwendung mit beliebigen Argumenten in den ersten Teil setzen. Der Teil nach dem & muss das beenden, was auch immer Sie Ihr Skript + .app genannt haben. Sie werden sehen, dass die Skript-App im Dock aufleuchtet, aber dann verschwindet sie.

Hinweis: Das Skript funktioniert nicht ordnungsgemäß, wenn es im Skript-Editor ausgeführt wird, sondern nur, wenn es in der von Ihnen erstellten Skriptanwendung ausgeführt wird.

16
MJeffryes

Ab OS X 10.6.2 kann der Befehl open über das Flag --args Argumente an die Anwendung übergeben, die er öffnet. Ein AppleScript sieht so aus:

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

Das sollte dir das Verhalten geben, das du willst.

25
Bob

Öffne Automator und erstelle eine Anwendung mit einem einzigen Run Shell Script Aktion:

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

Diese Anwendung startet Firefox und wird sofort beendet, wobei nur Firefox ausgeführt wird.


Alternativ können Sie eine Anwendung mit AppleScript Editor mit dem folgenden AppleScript-Code erstellen:

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

Beide funktionieren einwandfrei und lassen weder Terminal noch eine Skriptanwendung länger als eine Sekunde laufen. Mit Automator können Sie sogar einen Service erstellen, wenn Sie dies wünschen.

11
Daniel Beck

Dies ist eine alte Diskussion, aber sie taucht immer noch bei Google-Suchen auf. Ich dachte, ich würde ein paar ¢ hinzufügen.

Es ist wahrscheinlich besser, einen "Bundle-Bezeichner" zu verwenden, als einen absoluten Pfad zur ausführbaren Datei:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Oder in einem Apple Script:

do Shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Was ich noch nicht herausgefunden habe, ist, wie man eine neue Instanz/ein neues Fenster mit einem anderen Profil öffnet, sobald die erste bereits geöffnet ist. (Wenn ich das AppleScript oben ausführe, dann ein anderes mit "Profil 2", dann öffnet Chrome einfach noch ein weiteres Fenster als "Profil 1"). :(

8
user1722483

In diesem Szenario ist es nicht erforderlich (wie in einigen anderen Antworten vorgeschlagen), killall(oder ähnliches) zu verwenden, um den übergeordneten AppleScript-Anwendungsprozess („Applet“) zu beenden. Es kann sogar unerwünschte Nebenwirkungen haben, wenn der Name/das Muster von killallmehr als nur dem übergeordneten Applet-Prozess entspricht (z. B. andere, gleichzeitig ausgeführte AppleScript-Anwendungen, wenn "applet" als "" verwendet wird Muster)).

So etwas wie kill $PPID mag vernünftiger sein, aber wir möchten vielleicht nicht annehmen, dass das Applet einer AppleScript-Anwendung immer das unmittelbare übergeordnete Element der Shell ist, die von do Shell scriptgestartet wird. Zum Glück gibt es eine vernünftige Möglichkeit, das zu tun, was Sie brauchen.

Per TN2065 (unter "Ich möchte einen Hintergrundserverprozess starten; wie lasse ich ein Shell-Skript nicht warten, bis der Befehl abgeschlossen ist?") Die richtige Methode besteht darin, stdout und stderr umzuleiten und die Shell das Programm im Hintergrund ausführen zu lassen.

Verwenden Sie Script Editor, um das folgende Programm als AppleScript-Anwendung zu speichern:

do Shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(Funktionale Zeilenumbrüche wurden hinzugefügt, um sie „schmal“ zu halten. Löschen Sie den ¬ und den \\ und setzen Sie alles in eine lange Zeile, wenn Sie möchten.)

Es läuft lange genug, um Firefoxzu starten, und wird ordnungsgemäß beendet, während Firefoxweiterhin ausgeführt wird.

Die Umleitung ist erforderlich, da das Shell-Skriptnicht nur darauf wartet, dass sein unmittelbares untergeordnetes Element (die Shell) beendet wird, sondern auch auf (alle Instanzen) der schreibbaren Enden der Pipes Es wird erstellt, damit die Standard- und die Standard-Klasse der Shell geschlossen werden. Die Pipes stdout und stderr ( do Shell script) der Shell werden von den Programmen geerbt, die sie ohne Umleitung ausführen (auch solche, die im Hintergrund mit & ausgeführt werden). Die Umleitung stellt sicher, dass die Shell als letzte die beschreibbaren Enden der Pipes hält. Daher wird do Shell scriptunmittelbar nach dem Beenden der Shell zurückgegeben, sodass die AppleScript-Anwendung selbst beendet werden kann (da das do Shell scriptdas ist letzter Ausdruck im AppleScript-Programm).

Die anderen Antworten, die openinside verwenden, funktionieren mit Shell-Skript, weil open(eigentlich LaunchServices) führt die äquivalente Arbeit des Hintergrunds des resultierenden Programms aus und sendet sein stdout und stderr an eine andere Stelle.

7
Chris Johnsen

AppleScript

do Shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Zwei Punkte dort.

  1. Der Raum wird durch einen Backslash entkoppelt, der wiederum durch einen Backslash entkoppelt wird
  2. killall Applet kann Probleme verursachen, da möglicherweise andere Applets ausgeführt werden
  3. Speichern Sie es als Programm

Es funktioniert jedoch gut auf 10.6.5

4
anonymous

Im Folgenden sollten Sie Befehlszeilenargumente für die .app selbst angeben können:

Klicken Sie mit der rechten Maustaste auf das .app-Bundle, wählen Sie "Show Package Contents" (Paketinhalt anzeigen), navigieren Sie zu Info.plist, doppelklicken Sie darauf, suchen Sie den Args-Schlüssel und bearbeiten Sie ihn.

Ich habe momentan keine OS X-Maschine zur Hand, daher kann ich nicht prüfen, ob Sie dies auch für einen Alias ​​tun können (wenn Sie die ursprüngliche .app-Datei ohne Argumente usw. beibehalten möchten).

2
Dav

Packen Sie Ihre Anwendung in einen AppleScript-Launcher.

Hier sind die Schritte.

  1. Erstellen Sie ein AppleScript mit dem folgenden Inhalt und speichern Sie es als Anwendung (in diesem Beispiel heißt es "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do Shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Gehen Sie zu dieser App im Finder, klicken Sie mit der rechten Maustaste darauf, und zeigen Sie den Paketinhalt an.

  3. Platzieren Sie Ihre Anwendung im Stammverzeichnis des Paketinhalts. (In diesem Beispiel wäre es "Firefox 3.app")

    Ergebnis: /Programme/Firefox 3 launcher.app/Firefox 3.app

  4. Sie können jetzt Ihren Anwendungsstarter öffnen.

Anmerkungen:

  • Automatische Updates der umschlossenen Anwendung sollten in den meisten Fällen funktionieren.
  • Es sollte möglich sein, Drag-and-Drop-Vorgänge zum Launcher auszuführen, die automatisch an die umschlossene Anwendung umgeleitet werden (mit etwas mehr Skripting).
  • Der Launcher wird automatisch beendet, nachdem die umschlossene Anwendung gestartet wurde.
  • Ein Vorteil dieser Methode besteht darin, dass das Risiko des direkten Öffnens der umschlossenen Anwendung gering ist.
2
jlgrall

Der Befehl open verfügt über ein optionales Argument --args, dessen Wert als Argumente an die geöffnete Anwendung weitergegeben wird. Zum Beispiel:

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