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


60

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 opendies vermeiden, aber da ich die Anwendung nicht so ausführe , wie sie (nur /Applications/Firefox) gepackt ist , 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 &von am Ende des Skripts wird das beständige Terminalfenster beendet. Das einzige Ärgernis ist jetzt, dass es ein totes, abgemeldetes Terminalfenster öffnet (das ist besser als das beständige, aber immer noch ...)

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

2
Ich hoffe immer noch auf bessere Antworten auf diese
Frage

Wenn Sie einen Auftrag ausführen &, der noch zum Terminal gehört, können Sie dies beheben, indem Sie die Zeile disown %/Applications/Firefox.app/Contents/MacOS/firefox nach dem Ausführen hinzufügen. Anschließend können Sie das Terminal mithilfe von AppleScript sicher schließen.
22.

Suche nach Daniels Antwort - sie ist die vollständigste und perfekteste für heute (OSX 10.6.2 +).
Cregox

Antworten:


17

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 speichern Sie es als Anwendung .

Sie können jede Anwendung mit beliebigen Argumenten in den ersten Teil setzen. Der Teil nach dem &muss töten, 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.


Es funktioniert fast. Es wartet immer noch darauf, dass die Firefox-Instanz fertig ist, bis killall ausgeführt wird. Daher ruft sie den Debugger auf, wenn ich Firefox schließe, und die Skript-App verschwindet immer noch nicht. Hmmm ...
Andrew

Das ist komisch. Speichern Sie es als App und doppelklicken Sie dann auf die App? Es funktioniert nicht, wenn es im Skript-Editor ausgeführt wird.
MJeffryes

Außerdem stelle ich fest, dass ich vor dem & eine neue Zeile einfüge. Entfernen Sie den Zeilenvorschub, wenn Sie ihn haben
MJeffryes

Keine Notwendigkeit für & killall hier bei Snow Leopard 10.6.x - aber es konnte auch keine Möglichkeit gefunden werden, die App dazu zu bringen, sich selbst zu töten, sobald sie ausgeführt wird.
Cregox

1
@ Pacerier Überprüfen Sie die Daten zu dieser Antwort.
MJeffryes

28

Ab OS X 10.6.2 kann der Befehl open Argumente über das Flag --args 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.


"Mann offen", und da ist es! Lief wie am Schnürchen. --args flag und dann deine Argumente.
Michael Dimmitt

1
Ich habe es --argsmit Chrome versucht und es funktioniert nicht. Es wird nur für die erste Instanz funktionieren . Wenn Sie versuchen, zwei --user-data-dirgleichzeitig auszuführen , können Sie dies nicht tun, opensondern müssen es nach der alten /applications...Methode ausführen . Weiß jemand, warum zum Teufel --args nicht funktioniert?
Pacerier

1
@ Pacerier, "open-n"
Simon Wright

Um dies hinzuzufügen, können Sie das Skript im Skript-Editor erstellen und dann als Anwendung speichern.
Kevin C.

11

Öffnen Sie Automator und erstellen Sie eine Anwendung mit einer einzigen Aktion " Shell-Skript ausführen":

 /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.


1
Denken Sie nur daran, dass das open --argsin 10.6.2 implementiert wurde, wie Bob bereits erwähnte.
Cregox

Verwenden Sie es für: open eclipse.app -num einen zweiten Eclipse-Arbeitsbereich zu öffnen. Sehr praktisch. Vielen Dank!
Jonalv

In Automator konnte es mit der Aktion "Shell-Skript ausführen" in MacOS 10.14 nicht zum Laufen gebracht werden. Am Ende hatte ich jedoch Erfolg mit dem AppleScript.
Kevin C.

8

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"). :(


Ist -b funktional gleich -a? Wie unterscheiden sie sich?
Pacerier

7

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

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

Per TN2065 (unter „Ich möchte einen Hintergrund - Server starten,? Wie mache ich Shell - Skript machen nicht bis der Befehl ausgeführt warten“), ist die richtige Methode stdout und stderr zu umleiten und die Shell das Programm im Hintergrund laufen haben .

Verwenden Sie den Skript-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 es "schmal" zu halten; löschen Sie das ¬und \\und setzen Sie alles auf eine lange Zeile, wenn Sie möchten)

Es wird lange genug ausgeführt, um Firefox zu starten, und wird ordnungsgemäß beendet, während Firefox weiterhin ausgeführt wird.

Die Umleitung ist erforderlich, da das Shell-Skript nicht nur darauf wartet, dass sein unmittelbares untergeordnetes Element (die Shell) beendet wird, sondern auch darauf, dass (alle Instanzen von) den beschreibbaren Enden der Pipes, die es erstellt, stdout und stderr der Shell geschlossen werden . Die Pipes stdout und stderr der Shell ( do shell script ) werden von den Programmen geerbt, die sie ohne Umleitung ausführen (auch solche, die im Hintergrund mit ausgeführt werden &). Durch die Umleitung wird sichergestellt, dass die Hülle als letzte die beschreibbaren Enden der Pipes hält. Aus diesem Grund wird do-Shell-Skript unmittelbar nach dem Beenden der Shell zurückgegeben, sodass die AppleScript-Anwendung selbst beendet werden kann (da das do-Shell-Skript der letzte Ausdruck im AppleScript-Programm ist).

Die anderen Antworten, die open inside verwenden, funktionieren mit Shell-Skripten , da open (eigentlich LaunchServices) die gleiche Arbeit leistet wie das Hintergrundprogramm und das Senden von stdout und stderr an einen anderen Ort.


das ist sehr interessant. Ich frage mich, ob es vor 10.6.2 funktioniert ... aber ich denke immer noch, dass die Verwendung open --argssauberer aussieht. Gibt es einen Nachteil bei der Verwendung eines von ihnen?
Cregox

1
Ich weiß, dass diese Methode in 10.4 funktioniert. Ich habe den Eindruck, dass das Shell-Skript immer so funktioniert hat (es wurde in AppleScript 1.7 , das mit Mac OS X 10.1 geliefert wurde, zum OSAX- Standard hinzugefügt ). Wenn Sie bereit sind, 10.6 anzunehmen, ist das wahrscheinlich in Ordnung. open --args
Chris Johnsen

@ ChrisJohnsen, Link down ........
Pacerier

4

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. Das 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


appletbezieht sich auf?
Pacerier

3

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).


Leider ist kein Argumentschlüssel in der Liste. Laut Mozilla solltest du ein Skript verwenden - wiki.mozilla.org/MailNews:Logging#Mac
Andrew

Beachten Sie auch, dass das Ändern des Paketinhalts (z. B. Info.plist) Probleme mit der Codesignatur verursachen kann: bridge.grumpy-troll.org/2011/01/…
drevicko

2

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.

1

Warum benutzt du nicht:

#!/bin/sh
open /Applications/Firefox.app

Einfach, aber es funktioniert.


2
Das Terminal wird geöffnet, wenn Sie das tun.
MJeffryes

0

Der openBefehl verfügt über ein optionales --argsArgument, dessen Wert als Argumente an die geöffnete Anwendung übergeben wird. Zum Beispiel:

open /Applications/TextEdit.app --args example.txt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.