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

Hoe kan ik een programma met opdrachtregelargumenten uitvoeren in Mac OS

Is er een gemakkelijke manier om opdrachtregelargumenten toe te voegen aan een programma op een Mac? Om bijvoorbeeld Opera in kioskmodus te laten draaien of om een ander profiel in Firefox te gebruiken, kan ik

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

In Windows kan ik de argumenten toevoegen aan de eigenschappen van de snelkoppeling, maar aangezien Macs niet per se snelkoppelingen gebruiken en de programma’s direct starten, is dit niet mogelijk.

Ik heb ontdekt dat het starten van de programma’s via bash of Applescript gedeeltelijk werkt:

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

Ik kan deze uitvoerbaar maken en een pictogram toewijzen en alles werkt prima, behalve dat wanneer ik een van deze pseudo-programma’s uitvoer, er een terminal venster of een Applescript pictogram geopend blijft zolang de applicatie geopend is. Vermoedelijk zou het gebruik van het Applescript commando open dit voorkomen, maar omdat ik de applicatie niet uitvoer zoals hij is verpakt (alleen /Applications/Firefox), werkt het niet.

Dus, is er een betere manier om applicaties uit te voeren met commandoregel argumenten? Zo niet, is er een manier om te voorkomen dat een persistente terminal sessie of Applescript icoon open blijft terwijl de applicatie open is?

Edit

Volgens een Mozilla Wiki pagina , is het het beste om een script te gebruiken om de applicatie met argumenten uit te voeren. Het toevoegen van een & aan het eind van het script doodt het persistente Terminal venster. De enige ergernis is nu dat het een dood, uitgelogd Terminal venster opent (wat beter is dan het persistente, maar toch…)

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

Antwoorden (9)

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

Vanaf OS X 10.6.2 kan de opdracht open argumenten doorgeven aan het programma dat wordt geopend door middel van de vlag –args. Een AppleScript om dit te gebruiken ziet er als volgt uit:

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

Dat zou je al het gedrag moeten geven dat je wilt.

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

Hier is mijn beste oplossing: Maak een Applescript met:

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

En sla het op als een applicatie.

Je kunt elke applicatie met elke args in het eerste deel zetten. Het deel na de & moet de naam van je script + .app omzetten. Je zult de script app zien knipperen in het dock, maar het zal dan verdwijnen.

Opmerking: Het script zal niet goed werken wanneer het wordt uitgevoerd vanuit Script Editor, alleen wanneer het wordt uitgevoerd vanuit de scripttoepassing die je hebt gemaakt.

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

Open Automator en maak een Application met een enkele Run Shell Script actie:

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

Deze toepassing start Firefox en sluit onmiddellijk af, zodat alleen Firefox actief blijft.

  • *

Als alternatief kunt u een programma maken met AppleScript Editor met de volgende AppleScript-code:

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

Beide werken prima en laten Terminal of een script applicatie niet langer dan een seconde of zo draaien. Met Automator kun je zelfs een Service maken als je dat wilt.

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

Het is niet nodig (zoals sommige andere antwoorden suggereren) om killall (of iets dergelijks) te gebruiken om het moederproces van de AppleScript applicatie (“applet”) te doden in dit scenario. Het kan zelfs ongewenste neveneffecten hebben als de naam/het patroon gegeven aan killall overeenkomt met meer dan alleen het ouder applet proces (b.v. andere, gelijktijdig draaiende AppleScript applicaties (als “applet” als patroon wordt gebruikt)).

Iets als kill $PPID zou redelijker kunnen zijn, maar we willen misschien niet aannemen dat het applet van een AppleScript applicatie altijd de directe ouder is van de shell die gestart wordt door do shell script. Gelukkig is er een heel redelijke manier om te doen wat je nodig hebt.

Volgens TN2065 (onder “Ik wil een achtergrond-server proces starten; hoe zorg ik ervoor dat do shell script niet wacht totdat het commando is voltooid?”), is de juiste methode om stdout en stderr om te leiden en de shell het programma op de achtergrond te laten uitvoeren.

Gebruik Script Editor om het volgende programma op te slaan als een AppleScript programma:

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

(functionele regeleinden zijn toegevoegd om het “smal” te houden; verwijder de ¬ en \ en zet alles op één lange regel als je dat wilt)

Het zal lang genoeg draaien om Firefox te starten en zal netjes afsluiten terwijl Firefox doorgaat met draaien.

De omleiding is nodig omdat do shell script niet alleen wacht tot zijn directe kind (de shell) afsluit, maar ook wacht tot (alle instanties van) de beschrijfbare uiteinden van de pijpen die het creëert voor de shell’s stdout en stderr gesloten zijn. De stdout en stderr van de shell (de pijpen van do shell script) worden geërfd door de programma’s die hij uitvoert zonder omleiding (zelfs programma’s die op de achtergrond draaien met &); de omleiding zorgt ervoor dat de shell de laatste is die de beschrijfbare uiteinden van de pijpen vasthoudt. Dus do shell script zal onmiddellijk terugkomen nadat de shell is afgesloten, zodat het AppleScript programma zelf kan afsluiten (aangezien het do shell script de laatste uitdrukking is in het AppleScript programma).

De andere antwoorden die open gebruiken in do shell script werken omdat open (eigenlijk LaunchServices) het gelijkwaardige werk doet door het resulterende programma in de achtergrond te zetten en zijn stdout en stderr ergens anders heen te sturen.

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

Dit is een oude discussie, maar komt nog steeds naar boven bij Google-zoekopdrachten, dus ik dacht dat ik er een paar ¢ aan toe zou voegen.

Het is waarschijnlijk beter om een “bundle identifier” te gebruiken in plaats van een absoluut pad naar het uitvoerbare bestand:

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

Of in een Apple Script:

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

Wat ik nog niet heb uitgezocht is hoe ik een nieuwe instantie/venster met een ander profiel kan openen als de eerste al open is. (Als ik de bovenstaande AppleScript uitvoer, dan nog een met “Profiel 2”, dan opent Chrome nog steeds gewoon een nieuw venster als “Profiel 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"

Twee punten daar.

  1. De spatie wordt ge-escaped door een backslash die weer ge-escaped wordt door een backslash
  2. killall applet kan problemen veroorzaken, omdat er andere applets kunnen draaien
  3. Sla het op als programma

Het werkt echter goed op 10.6.5

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

Het volgende zou je in staat moeten stellen om command-line argumenten te specificeren voor de .app zelf:

Klik met de rechtermuisknop op de .app bundel, selecteer “Pakketinhoud weergeven”, navigeer naar Info.plist, dubbelklik erop, zoek de Args sleutel, bewerk.

Ik heb op dit moment geen OS X machine bij de hand, dus ik kan niet nagaan of je dit ook met een alias zou kunnen doen (als je de oorspronkelijke .app argument-vrij zou willen houden, enzovoort).

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

Wikkel je applicatie in een AppleScript launcher.

Hier zijn de stappen.

  1. Maak een AppleScript met de volgende inhoud, en sla het op als een toepassing (in dit voorbeeld heet het “Firefox 3 launcher.app”).

  2. Ga naar die app in de Finder, klik er met rechts op, toon de inhoud van het pakket.

  3. Zet je applicatie in de root van de pakketinhoud. (In dit voorbeeld zou dat “Firefox 3.app” zijn)

  4. U kunt nu de launcher van uw toepassing openen.

Opmerkingen:

  • Automatische updates van de ingepakte applicatie zouden in de meeste gevallen moeten werken.
  • Het zou mogelijk moeten zijn om elke drag-and-drop naar de launcher automatisch naar de gewrapte applicatie te laten leiden (met een beetje meer scripting).
  • De launcher sluit automatisch af nadat de ingepakte toepassing is gestart.
  • Een voordeel van deze methode is dat er weinig risico’s zijn om de gewrapte applicatie direct te openen.
1
1
1
2019-03-29 23:38:35 +0000

Het open commando heeft een optioneel --args argument waarvan de waarde als argumenten aan de geopende toepassing zal worden doorgegeven. Bijvoorbeeld:

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