Come posso eseguire un'applicazione con argomenti da riga di comando in Mac OS


60

Esiste un modo semplice per aggiungere argomenti della riga di comando a un'applicazione su un Mac? Ad esempio, per eseguire Opera in modalità kiosk o per utilizzare un profilo diverso in Firefox, posso digitare

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

In Windows posso aggiungere gli argomenti alle proprietà del collegamento, ma poiché i Mac non usano il collegamento di per sé ed eseguono direttamente le applicazioni, questo non è possibile.

Ho scoperto che l'avvio delle applicazioni tramite bash o Applescript funziona parzialmente:

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

Posso rendere questi eseguibili e assegnare un'icona e tutto funziona alla grande, tranne che quando eseguo uno di questi pseudo programmi, una finestra terminale o un'icona Applescript rimane aperta finché l'applicazione è aperta. Presumibilmente, l'uso del comando Applescript openeviterebbe questo, ma poiché non sto eseguendo l'applicazione in quanto è impacchettata (solo /Applications/Firefox), non funziona.

Quindi, c'è un modo migliore per eseguire applicazioni con argomenti da riga di comando? In caso contrario, c'è un modo per impedire che una sessione terminale persistente o l'icona di Applescript rimangano aperti mentre l'applicazione è aperta?

modificare

Secondo una pagina Wiki di Mozilla , è meglio usare uno script per eseguire l'applicazione con argomenti. L'aggiunta di &a alla fine dello script uccide la finestra Terminale persistente. L'unico fastidio ora è che apre una finestra Terminale morta e disconnessa (che è migliore di quella persistente, ma comunque ...)

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

2
Spero ancora di avere risposte migliori su questo ...
cregox,

Quando esegui un lavoro con &esso appartiene ancora al Terminale, puoi correggerlo aggiungendo la riga disown %/Applications/Firefox.app/Contents/MacOS/firefox dopo averlo eseguito, quindi puoi chiudere in sicurezza il Terminale, usando AppleScript.
ottobre

cerca la risposta di Daniel: è la più completa e perfetta per oggi (OSX 10.6.2 +).
Cregox,

Risposte:


17

Ecco la mia soluzione migliore: crea un script con:

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

E salvalo come un'applicazione .

Puoi mettere qualunque applicazione con qualunque argomento nella prima parte. La parte dopo ha &bisogno di uccidere qualunque cosa tu abbia chiamato il tuo script + .app. Vedrai l'app di script lampeggiare nel dock, ma poi scomparirà.

Nota: lo script non funzionerà correttamente quando eseguito da Script Editor, solo quando eseguito dall'applicazione di script creata.


Funziona quasi. Sta ancora aspettando che l'istanza di Firefox venga eseguita fino a quando non viene eseguito killall, quindi chiama il debugger quando chiudo Firefox e l'app di script non scompare ancora. Hmmm ...
Andrew

Quello è strano. Lo stai salvando come App, quindi fai doppio clic sull'App? Non funzionerà se eseguito da Script Editor.
MJeffryes,

Inoltre, noto di aver inserito una nuova riga prima di &. Rimuovi la nuova riga se ce l'hai
MJeffryes

non c'è bisogno di & killall qui su Snow Leopard 10.6.x - ma non è stato possibile trovare alcun modo per far sì che l'app si uccida da sola non appena viene eseguita.
Cregox,

1
@Pacerier Controlla le date su questa risposta.
MJeffryes,

28

A partire da OS X 10.6.2, il comando open può passare argomenti all'applicazione che apre tramite il flag --args. Un AppleScript da utilizzare è simile al seguente:

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

Questo dovrebbe darti tutto il comportamento che desideri.


"man open", ed eccolo qui! ha funzionato come un fascino. --args flag e quindi i tuoi argomenti.
Michael Dimmitt,

1
Ho provato --argscon Chrome e non funziona. Funzionerà solo per la prima istanza . Se si tenta di eseguirne due --user-data-dircontemporaneamente, non è possibile farlo openma è necessario eseguirlo con il vecchio /applications...metodo. Qualcuno sa perché cazzo --args non funziona?
Pacerier,

1
@Pacerier, "open -n"
Simon Wright,

Per aggiungere a ciò, è possibile creare lo script in Script Editor e quindi salvare come applicazione.
Kevin C.

11

Apri Automator e crea un'applicazione con una singola azione Run Shell Script :

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

Questa applicazione avvia Firefox e si chiude all'istante, lasciando solo Firefox in esecuzione.


In alternativa, crea un'applicazione utilizzando AppleScript Editor con il seguente codice AppleScript:

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

Entrambi funzionano bene e non mantengono in esecuzione Terminal o un'applicazione di script per più di un secondo circa. Utilizzando Automator, puoi anche creare un servizio se lo desideri.


1
Tieni presente che è open --argsstato implementato in 10.6.2, come già menzionato da Bob.
Cregox,

Usandolo per: open eclipse.app -nper aprire un secondo spazio di lavoro Eclipse. Molto maneggevole. Grazie!
jonalv

Impossibile farlo funzionare in Automator con l'azione "Esegui script shell" in MacOS 10.14. Alla fine ho avuto successo con AppleScript.
Kevin C.

8

Questa è una vecchia discussione, ma emerge ancora dalle ricerche su Google, quindi ho pensato di aggiungere un paio di ¢.

Probabilmente è meglio usare un "identificatore di bundle" piuttosto che il percorso assoluto dell'eseguibile:

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

O in uno script di Apple:

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

Quello che non ho ancora capito è come aprire una nuova istanza / finestra con un profilo diverso una volta che la prima è già aperta. (Se eseguo AppleScript sopra, quindi un altro con "Profilo 2", Chrome aprirà comunque un'altra finestra come "Profilo 1"). :(


-B è funzionalmente uguale a -a? Come sono differenti?
Pacerier,

7

In questo scenario non è necessario (come suggerito da altre risposte) utilizzare killall (o simile) per terminare il processo dell'applicazione AppleScript padre ("applet"). Può anche avere effetti collaterali spiacevoli se il nome / modello dato a killall corrisponde a più del semplice processo dell'applet padre (ad esempio, altre applicazioni AppleScript in esecuzione contemporaneamente (se si utilizza "applet" come modello)).

Qualcosa del genere kill $PPIDpotrebbe essere più ragionevole, ma potremmo non voler supporre che l'applet di un'applicazione AppleScript sia sempre il genitore immediato della shell avviata da do shell script . Fortunatamente, esiste un modo perfettamente ragionevole per fare ciò di cui hai bisogno.

Per TN2065 (in "Voglio avviare un processo del server in background; come faccio a fare in modo che lo script della shell non aspetti fino al completamento del comando?"), Il metodo corretto è reindirizzare stdout e stderr e fare in modo che la shell esegua il programma in background .

Utilizzare Script Editor per salvare il seguente programma come applicazione AppleScript:

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

(interruzioni di riga funzionali aggiunte per mantenerlo “stretto”; eliminare ¬e \\e mettere tutto su una linea lunga se lo si desidera)

Funzionerà abbastanza a lungo per avviare Firefox e si chiuderà in modo pulito mentre Firefox continua a funzionare.

Il reindirizzamento è necessario perché non solo lo script della shell attende l'uscita del suo figlio immediato (la shell), ma attende anche (tutte le istanze di) le estremità scrivibili dei tubi che crea per la chiusura dello stdout e dello stderr della shell . Lo stdout e lo stderr della shell ( eseguono pipe dello script di shell ) sono ereditati dai programmi che esegue senza reindirizzamento (anche quelli eseguiti in background con &); il reindirizzamento assicura che la shell sia l'ultima a contenere le estremità scrivibili delle pipe. Pertanto, lo script do shell tornerà immediatamente dopo l'uscita dalla shell, consentendo all'applicazione AppleScript stessa di uscire (poiché lo script do shell è l'ultima espressione nel programma AppleScript).

Le altre risposte che usano open inside funzionano come script di shell perché open (in realtà LaunchServices) fa il lavoro equivalente di backgrounding del programma risultante e invio di stdout e stderr altrove.


Questo è molto interessante. Mi chiedo se funzioni prima del 10.6.2 ... ma penso ancora che l'utilizzo abbia un open --argsaspetto più pulito. c'è qualche svantaggio nell'usarne qualcuno?
Cregox,

1
So che questo metodo funziona in 10.4. La mia impressione è che lo script di shell abbia sempre funzionato in questo modo (è stato aggiunto alle aggiunte standard OSAX in AppleScript 1.7 , fornito con Mac OS X 10.1). Se sei disposto ad assumere 10.6, allora open --argsprobabilmente va bene.
Chris Johnsen,

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

4

AppleScript

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

Due punti lì.

  1. Lo spazio è evaso da una barra rovesciata che è di nuovo sfuggita da barra rovesciata
  2. l'applet killall può causare problemi, perché potrebbero esserci altre applet in esecuzione
  3. Salvalo come programma

Tuttavia funziona bene su 10.6.5


appletsi riferisce a?
Pacerier,

3

Quanto segue dovrebbe consentire di specificare gli argomenti della riga di comando per il .app stesso:

Fai clic con il pulsante destro del mouse sul pacchetto .app, seleziona "Mostra contenuto pacchetto", vai a Info.plist, fai doppio clic su di esso, trova la chiave Args, modifica.

Al momento non ho una macchina OS X a portata di mano, quindi non posso verificare se è possibile farlo anche con un alias (se si desidera mantenere l'originale .app senza argomenti, eccetera).


Sfortunatamente, non c'è chiave args nella lista. Secondo Mozilla, dovresti usare uno script - wiki.mozilla.org/MailNews:Logging#Mac
Andrew

Si noti inoltre che la modifica del contenuto del pacchetto (come Info.plist) può causare problemi con la firma del codice: bridge.grumpy-troll.org/2011/01/…
drevicko

2

Avvolgi la tua applicazione in un launcher AppleScript.

Ecco i passaggi.

  1. Crea un AppleScript con il seguente contenuto e salvalo come applicazione (in questo esempio si chiama "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. Arriva a quell'app nel Finder, fai clic con il tasto destro del mouse, mostra il contenuto del pacchetto.

  3. Inserisci la tua applicazione nella radice del contenuto del pacchetto. (In questo esempio sarebbe "Firefox 3.app")

    Risultato: / Applicazioni / Firefox 3 launcher.app/Firefox 3.app

  4. È ora possibile aprire il programma di avvio dell'applicazione.

Appunti:

  • Gli aggiornamenti automatici dell'applicazione spostata dovrebbero funzionare nella maggior parte dei casi.
  • Dovrebbe essere possibile eseguire il trascinamento della selezione sul programma di avvio automaticamente reindirizzato all'applicazione spostata (con un po 'più di scripting).
  • Il programma di avvio si chiude automaticamente dopo l'avvio dell'applicazione avvolta.
  • Un vantaggio di questo metodo è che ci sono pochi rischi nell'aprire direttamente l'applicazione incartata.

1

Perché non usi:

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

Semplice ma funziona.


2
Se lo fai, il terminale si aprirà.
MJeffryes,

0

Il opencomando ha un --argsargomento facoltativo il cui valore verrà passato all'applicazione aperta come argomenti. Per esempio:

open /Applications/TextEdit.app --args example.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.