it-swarm.it

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

C'è un modo semplice per aggiungere gli 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à di 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 file eseguibili e assegnare un'icona e tutto funziona alla grande eccetto che quando eseguo uno di questi pseudo programmi, una finestra di terminale o un'icona di Applescript rimane aperta finché l'applicazione è aperta. Presumibilmente, usando il comando Applescript open si eviterebbe questo, ma poiché non sto eseguendo l'applicazione così come è impacchettata (solo /Applications/Firefox), non funziona.

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

Edit

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

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

Ecco la mia soluzione migliore: creare un oggetto Applescript con:

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

E salvalo come un'applicazione .

Puoi inserire qualsiasi applicazione con qualunque argomento nella prima parte. La parte dopo & deve uccidere qualsiasi cosa tu abbia nominato il tuo script + .app. Vedrai l'app di script lampeggiare nel dock, ma poi sparirà.

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

16
MJeffryes

A partire da OS X 10.6.2, il comando open può passare argomenti all'applicazione che apre con il flag --args. Un AppleScript per usarlo assomiglia a questo:

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

Questo dovrebbe darti tutto il comportamento che desideri.

25
Bob

Apri Automator e crea un'applicazione con un singolo Esegui script di shell azione:

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

Questa applicazione avvierà Firefox e uscirà immediatamente, lasciando solo Firefox in esecuzione.


In alternativa, crea un'applicazione usando 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 Terminal o un'applicazione di script in esecuzione per più di un secondo. Usando Automator, puoi anche creare un servizio se lo selezioni.

11
Daniel Beck

Questa è una vecchia discussione, ma continua a venire nelle ricerche di Google, quindi ho pensato di aggiungere un paio di ¢.

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

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

O in uno script 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 quando il primo è già aperto. (Se eseguo l'AppleScript sopra, quindi un altro con "Profilo 2", Chrome aprirà comunque un'altra finestra come "Profilo 1"). :(

8
user1722483

Non è necessario (come hanno suggerito altre risposte) utilizzare killall (o simili) per uccidere il processo dell'applicazione AppleScript ("applet") principale in questo scenario. Può anche avere effetti collaterali spiacevoli se il nome/modello dato a killall corrisponde più del semplice processo dell'applet genitore (ad es. Altri, eseguendo contemporaneamente applicazioni AppleScript (se si usa "applet" come Il modello)).

Qualcosa come kill $PPID potrebbe essere più ragionevole, ma potremmo non voler assumere che l'applet di un'applicazione AppleScript sia sempre il genitore immediato della shell avviata da fa script di shell . Fortunatamente, c'è un modo perfettamente ragionevole per fare ciò che ti serve.

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

Usa 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 tenerlo "stretto"; eliminare ¬ e \\ e mettere tutto su una riga lunga se lo si desidera)

Verrà eseguito abbastanza a lungo da avviare Firefox e uscirà in modo pulito mentre Firefox continua a funzionare.

Il reindirizzamento è richiesto perché non solo fa fa che lo script di Shell attenda che il suo figlio immediato (la Shell) esca, ma aspetta anche (tutte le istanze di) le estremità scrivibili del pipe che crea per lo stdout e lo stderr di Shell da chiudere. Lo stdout e lo stderr di Shell ( eseguono pipe di script di Shell ) sono ereditati dai programmi che esegue senza reindirizzamento (anche quelli eseguiti in background con &); il reindirizzamento garantisce che la Shell sia l'ultima a contenere le estremità scrivibili delle pipe. Quindi, lo script di shell tornerà immediatamente dopo l'uscita di Shell, consentendo all'applicazione AppleScript di uscire (dal momento che esegue lo script Shell è l'ultima espressione del programma AppleScript).

Le altre risposte che usano open inside fanno funzionare lo script di shell perché open ( in realtà LaunchServices) esegue l'equivalente lavoro di backgrounding del programma risultante e inviando il suo stdout e stderr altrove.

7
Chris Johnsen

AppleScript

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

Due punti lì.

  1. Lo spazio è sfuggito da una barra rovesciata che viene nuovamente evasa dalla barra inversa
  2. killall applet può causare problemi, perché potrebbero esserci altre applet in esecuzione
  3. Salvalo come programma

Tuttavia funziona bene su 10.6.5

4
anonymous

Il seguente dovrebbe consentire di specificare gli argomenti della riga di comando per .app stesso:

Fai clic con il tasto destro del mouse su "App bundle", 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 controllare se si può fare anche questo ad un alias (se si desidera mantenere l'originale .app argument-free, eccetera).

2
Dav

Avvolgi la tua applicazione all'interno di un launcher AppleScript.

Ecco i passaggi.

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

  3. Metti 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 puoi aprire il tuo programma di avvio delle applicazioni.

Gli appunti:

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

Il comando open ha un argomento --args opzionale il cui valore verrà passato all'applicazione aperta come argomento. Per esempio:

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