2009-08-01 09:24:24 +0000 2009-08-01 09:24:24 +0000
60
60
Advertisement

Wie kann ich ein Programm mit Befehlszeilenargumenten in Mac OS ausführen

Advertisement

Gibt es eine einfache Möglichkeit, Befehlszeilenargumente an eine Anwendung auf einem Mac anzuhängen? Um z. B. Opera im Kiosk-Modus zu starten oder ein anderes Profil in Firefox zu verwenden, kann ich

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

eingeben. Unter Windows kann ich die Argumente an die Eigenschaften der Verknüpfung anhängen, aber da Macs keine Verknüpfung 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 Icon zuweisen und alles funktioniert prima, außer dass, wenn ich eines dieser Pseudoprogramme starte, entweder ein Terminalfenster oder ein Applescript-Icon 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 verpackt ist (nur /Applications/Firefox), funktioniert es nicht.

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

Edit

Laut einer Mozilla Wiki-Seite ist es am besten, ein Skript zu verwenden, um die Anwendung mit Argumenten auszuführen. Das Hinzufügen eines & am Ende des Skripts tötet das persistente Terminalfenster. Das einzige Ärgernis ist jetzt, dass es ein totes, abgemeldetes Terminal-Fenster öffnet (was besser ist als das persistente, aber trotzdem…)

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

Antworten (9)

30
30
30
2010-03-04 20:13:16 +0000

Ab OS X 10.6.2 kann der Befehl open mit dem Flag –args Argumente an das zu öffnende Programm übergeben. Ein AppleScript zur Verwendung sieht wie folgt aus:

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

Das sollte Ihnen das gewünschte Verhalten geben.

18
18
18
2009-08-01 11:56:26 +0000

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

Sie können in den ersten Teil eine beliebige Anwendung mit beliebigen Args schreiben. Der Teil nach dem & muss das töten, was auch immer Sie Ihr Skript + .app genannt haben. Sie werden die Skript-App im Dock aufblitzen sehen, aber sie wird dann verschwinden.

Hinweis: Das Skript funktioniert nicht richtig, wenn es vom Skript-Editor aus gestartet wird, sondern nur, wenn es von der Skript-Anwendung aus gestartet wird, die Sie erstellt haben.

14
Advertisement
14
14
2011-01-22 13:04:27 +0000
Advertisement

Öffnen Sie Automator und erstellen Sie eine Applikation mit einer einzigen Run Shell Script Aktion:

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

Diese Anwendung wird Firefox starten und sofort beenden, so dass nur Firefox läuft.


Alternativ können Sie ein Programm mit dem 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 Skript-Anwendung länger als eine Sekunde oder so laufen. Mit Automator können Sie sogar einen Service erstellen, wenn Sie dies wünschen.

8
8
8
2011-03-13 03:59:54 +0000

Es ist nicht notwendig (wie einige andere Antworten vorgeschlagen haben), killall (oder ähnlich) zu verwenden, um den übergeordneten AppleScript-Anwendungsprozess (“applet”) in diesem Szenario zu beenden. Es kann sogar unerwünschte Nebeneffekte haben, wenn der Name/das Muster, der/das an killall übergeben wird, auf mehr als nur den übergeordneten Applet-Prozess zutrifft (z.B. auf andere, gleichzeitig laufende AppleScript-Anwendungen (wenn “applet” als Muster verwendet wird)).

Etwas wie kill $PPID wäre vielleicht vernünftiger, aber wir wollen vielleicht nicht annehmen, dass das Applet einer AppleScript-Anwendung immer das unmittelbare Elternteil der mit do shell script gestarteten Shell ist. Glücklicherweise gibt es eine vollkommen vernünftige Möglichkeit, das zu tun, was Sie brauchen.

Laut TN2065 (unter “Ich möchte einen Serverprozess im Hintergrund starten; wie bringe ich do shell script dazu, nicht zu warten, bis der Befehl abgeschlossen ist?”) ist die richtige Methode, stdout und stderr umzuleiten und die Shell das Programm im Hintergrund ausführen zu lassen.

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

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

(funktionale Zeilenumbrüche hinzugefügt, um es “schmal” zu halten; löschen Sie die ¬ und \ und setzen Sie alles auf eine lange Zeile, wenn Sie möchten)

Es wird lange genug laufen, um Firefox zu starten und wird sauber beendet, während Firefox weiterläuft.

Die Umleitung ist erforderlich, weil do shell script nicht nur darauf wartet, dass sein unmittelbares Kind (die Shell) beendet wird, sondern auch darauf, dass (alle Instanzen von) die beschreibbaren Enden der Pipes, die es für stdout und stderr der Shell erzeugt, geschlossen werden. Die stdout und stderr der Shell (die Pipes von do shell script) werden an die Programme vererbt, die es ohne Umleitung ausführt (auch an solche, die im Hintergrund mit & laufen); die Umleitung stellt sicher, dass die Shell die letzte ist, die die beschreibbaren Enden der Pipes hält. Daher kehrt do shell script sofort zurück, nachdem die Shell beendet wurde, und ermöglicht es dem AppleScript-Programm selbst, sich zu beenden (da do shell script der letzte Ausdruck im AppleScript-Programm ist).

Die anderen Antworten, die open innerhalb von do shell script verwenden, funktionieren, weil open (eigentlich LaunchServices) die äquivalente Arbeit macht, das resultierende Programm in den Hintergrund zu stellen und dessen stdout und stderr an eine andere Stelle zu senden.

8
Advertisement
8
8
2014-08-22 20:50:57 +0000
Advertisement

Dies ist eine alte Diskussion, die aber immer noch bei Google-Suchen auftaucht, also dachte ich, ich füge ein paar ¢ hinzu.

Es ist wahrscheinlich besser, einen “Bundle Identifier” zu verwenden als den absoluten Pfad zur ausführbaren Datei:

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

Oder in einem Apple-Skript:

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/Fenster mit einem anderen Profil öffnet, wenn die erste bereits geöffnet ist. (Wenn ich das obige AppleScript ausführe, dann ein weiteres mit “Profil 2”, dann öffnet Chrome trotzdem nur ein weiteres Fenster als “Profil 1”) :(

4
4
4
2011-01-22 12:48:22 +0000

AppleScript

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

Zwei Punkte gibt es.

  1. Das Leerzeichen wird durch einen Backslash escaped, der wiederum durch einen Backslash escaped wird
  2. killall applet kann zu Problemen führen, da eventuell andere Applets laufen
  3. Speichern Sie es als Programm

Es funktioniert jedoch gut auf 10.6.5

3
Advertisement
3
3
2009-08-01 10:30:41 +0000
Advertisement

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

Rechtsklick auf .app-Bundle, “Paketinhalt anzeigen” wählen, zu Info.plist navigieren, doppelklicken, Schlüssel Args finden, bearbeiten.

Ich habe gerade keinen OS X-Rechner zur Hand, daher kann ich nicht überprüfen, ob man das auch mit einem Alias machen könnte (wenn man die ursprüngliche .app argumentfrei halten wollte, usw.).

2
2
2
2011-03-22 19:32:58 +0000

Verpacken Sie Ihr Programm in einen AppleScript Launcher.

Hier sind die Schritte.

  1. Erstellen Sie ein AppleScript mit folgendem Inhalt, und speichern Sie es als Programm (in diesem Beispiel heißt es “Firefox 3 launcher.app”).

  2. Gehen Sie zu dieser App im Finder, klicken Sie sie mit der rechten Maustaste an, zeigen Sie den Paketinhalt an.

  3. Legen Sie Ihre Anwendung in das Stammverzeichnis des Paketinhalts. (In diesem Beispiel wäre es “Firefox 3.app”)

  4. Sie können nun den Launcher Ihrer Anwendung öffnen.

Hinweise:

  • Automatische Updates der gewickelten Anwendung sollten in den meisten Fällen funktionieren.
  • Es sollte möglich sein, jedes Drag-and-Drop auf den Launcher automatisch auf die verpackte Anwendung umzuleiten (mit etwas mehr Skripting).
  • Der Launcher wird automatisch beendet, nachdem die gewickelte Anwendung gestartet wurde.
  • Ein Vorteil dieser Methode ist, dass das Risiko, die gewrappte Anwendung direkt zu öffnen, gering ist.
1
Advertisement
1
1
2019-03-29 23:38:35 +0000
Advertisement

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

open /Applications/TextEdit.app --args example.txt
Advertisement

Verwandte Fragen

12
7
5
15
1
Advertisement