Avvia un'app su OS X con la riga di comando


109

Voglio avviare un'app su OSX da uno script. Devo passare gli argomenti della riga di comando. Sfortunatamente, opennon accetta argomenti della riga di comando.

L'unica opzione a cui riesco a pensare è quella di utilizzare nohup myApp > /dev/null &per avviare la mia app in modo che possa esistere indipendentemente dallo script che la avvia.

Qualche suggerimento migliore?


Non riesco a seguire la domanda. "open" non accetta argomenti della riga di comando? Cos'è "aperto"? È questo l'AppleScript aperto? Come nohup &risolve il problema?
S.Lott

4
man open (1) - Comando OS X per avviare file o app
Ned Deily

3
Dovrebbe essere su superuser.com
Jeff Meatball Yang

Risposte:


78

In OS X 10.6, il opencomando è stato migliorato per consentire il passaggio di argomenti all'applicazione:

open ./AppName.app --args -AppCommandLineArg

Ma per le versioni precedenti di Mac OS X e poiché i bundle di app non sono progettati per essere passati agli argomenti della riga di comando, il meccanismo convenzionale è quello di utilizzare Apple Events per file come qui per le app Cocoa o qui per le app Carbon. Probabilmente potresti anche fare qualcosa di kludgey passando i parametri usando le variabili d'ambiente.


Il mio approccio con kludgey consiste nell'invocare l'eseguibile direttamente con gli argomenti della riga di comando usando nohup - se l'ambiente-vars-kludge less kludgey?
psychotik

2
Probabilmente no. Se funziona per te, fallo. Il punto più importante è che open (1) è l'equivalente cli di ciò che accade quando un utente fa un doppio clic o un "Apri" nel Finder e nessuno di questi meccanismi supporta gli argomenti della riga di comando convenzionali.
Ned Deily

+1: non dovresti utilizzare argomenti della riga di comando per le applicazioni GUI di Mac OS X.
S.Lott

2
dì a Google di non utilizzare gli argomenti della riga di comando, Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal

@Anurag Uniyal. "Perché?" Hai letto la risposta? "il meccanismo convenzionale è quello di utilizzare Apple Events per file come qui per le app Cocoa o qui per le app Carbon". Questo è il modo in cui è progettato Mac OS X. Sì. Chrome infrange le regole. Così fa ogni singola utilità della riga di comando di Linux. Ma le applicazioni GUI con cui vengono aperte non opensono, come dice la risposta, progettate per funzionare dalla riga di comando. "Perché?" Perché è così che funziona Mac OS X.
S.Lott

105

Come è stato menzionato nella domanda qui , il opencomando nella 10.6 ora ha un argsflag, quindi puoi chiamare:

open -n ./AppName.app --args -AppCommandLineArg


Funzionando esattamente nel modo in cui era richiesto. Grazie
DTdev

Questo ha funzionato e mi ha permesso di impostare un alias zsh per Chromium. Grazie
jamescampbell

Questa risposta è ottima. Volevo solo aggiungere che quando apri per la prima volta Terminal sarai nella tua directory home, quindi digitalo in questo modo in modo da non dover passare alla directory dell'applicazione. Volevo eseguire Gimp senza caricare i caratteri, il che richiede un'eternità, quindi lo digito con l'opzione -f per omettere i caratteri: open -n /Applications/GIMP.app --args -f
James Toomey

32

Un bundle di applicazioni (un .appfile) è in realtà un mucchio di directory. Invece di usare opene il .appnome, puoi effettivamente spostarti su di esso e avviare il binario effettivo. Per esempio:

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

Questo è il binario effettivo che potrebbe accettare argomenti (o no, nel LittleSnappercaso di).


3
Il binario accetta argomenti, ne sono sicuro. L'ho scritto io. Invocare "open" non consente il passaggio di argomenti. Sono abbastanza sicuro di questo. E sì, il mio script chiama direttamente "open binary", non cercando di aprire il bundle.
psychotik

@psychotik: Non sta dicendo di chiamare "binario aperto". Sta dicendo di eseguire direttamente il binario.
Chuck

Non funzionerà per me. L'esecuzione diretta dei risultati binari diventa un processo figlio del mio script, cosa che sicuramente non voglio. Da qui la necessità di utilizzare open / nohup
psychotik il

1
Se si tratta di uno script di shell, utilizzare "exec" per sostituire il processo di script con l'eseguibile effettivo.
Jonathan Leffler

2
Questo approccio ha un grave inconveniente: se il bundle contiene librerie personalizzate e dei quadri, avrete bisogno di giocherellare con DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko

14

Nel caso in cui la tua app debba funzionare sui file (quello che normalmente ti aspetteresti di passare come :) ./myApp *.jpg, lo faresti in questo modo:

open *.jpg -a myApp

Questo è esattamente quello che stavo cercando! La mia istanza, ad esempio: open something.py -a Eclipse.app
Eric

4

Consiglierei la tecnica offerta da MathieuK. Nel mio caso, dovevo provarlo con Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

Mi rendo conto che questo non risolve il problema dell'OP, ma si spera che faccia risparmiare tempo a qualcun altro. :)


@Pacerier Aggiungi un "&" alla fine di questo comando. Verrà avviato in background. È quindi possibile chiudere la finestra del terminale e l'applicazione probabilmente rimarrà aperta.
Paul Irish

2

openha anche un flag -a, che puoi usare per aprire un'app dalla cartella Applicazioni in base al suo nome (o tramite l'identificatore del bundle con il flag -b). Puoi combinarlo con l'opzione --args per ottenere il risultato desiderato:

open -a APP_NAME --args ARGS

Per aprire un video nel lettore VLC che dovrebbe ridimensionarsi con un fattore 2x e loop, ad esempio eseguirai:

open -a VLC --args -L --fullscreen

Si noti che non sono riuscito a ottenere l'output dei comandi sul terminale. (anche se non ho provato nulla per risolverlo)


Hai ripetuto open -aintenzionalmente ?? In ogni caso, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllnon funziona per me.
Pacerier

Perdonatemi, la mia sintassi è completamente fuori posto per qualche motivo. Adesso aggiornerò.
rien333

2

Volevo avere due istanze separate di Chrome in esecuzione, ciascuna con il proprio profilo. Volevo poterli avviare da Spotlight , come è mia abitudine avviare le app per Mac. In altre parole, avevo bisogno di due normali applicazioni Mac, regChromeper la normale navigazione e altChromeper utilizzare il profilo speciale, da avviare facilmente premendo ⌘-spazio per visualizzare Spotlight, quindi "reg" o "alt", quindi Invio.

Suppongo che il modo brute-force per raggiungere l'obiettivo di cui sopra sarebbe quello di creare due copie del bundle dell'applicazione Google Chrome con i rispettivi nomi. Ma è brutto e complica l'aggiornamento.

Quello che ho ottenuto sono state due applicazioni AppleScript contenenti due comandi ciascuna. Ecco quello per altChrome:

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

La seconda riga avvia Chrome con il profilo alternativo (il --user-data-dirparametro).

La prima riga è un tentativo non riuscito di assegnare alle due applicazioni icone distinte. Inizialmente, sembra funzionare bene. Tuttavia, prima o poi, Chrome rilegge il suo file icona e ottiene quello corrispondente a quella delle due app avviata per ultima, risultando in due applicazioni in esecuzione con la stessa icona. Ma non mi sono preoccupato di provare a risolverlo: tengo i due browser su desktop separati e la navigazione tra di essi non è stato un problema.


2

A partire da OS X Yosemite , ora possiamo utilizzare AppleScript e Automator per automatizzare attività complesse. JavaScript per l'automazione può ora essere utilizzato come linguaggio di scripting.

Questa pagina fornisce un buon esempio di script di esempio che può essere scritto dalla riga di comando utilizzando la modalità interattiva bash e osascript . Apre una scheda Safari e passa a example.com.

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;

controlla Script Editor / Window / Library per un elenco di app che hanno l'automazione di AppleScript disponibile. Stavo cercando Vysor, basato su Chrome, e penso di aver bisogno di un modo diverso.
AnneTheAgile

Più complessità ftw!
Pacerier

1

Con applecript:

tell application "Firefox" to activate

Come si passano gli argomenti a Firefox? Ad esempio, -no-remote -P "Un altro profilo". Quando si sviluppano componenti aggiuntivi e simili, è conveniente avere due processi Firefox separati che utilizzano due profili separati. Il tuo profilo normale e una sandbox in cui eseguire il debug della tua estensione.
George,

Credo che ti stia riferendo a una direttiva AppleScript, ma la domanda riguarda l'apertura dalla riga di comando ...
conny

0

Perché non impostare semplicemente aggiungi percorso al cestino dell'app. Per MacVim, ho fatto quanto segue.

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

Un alias, è un'altra opzione che ho provato.

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

Con l'esportazione PATH posso chiamare tutti i comandi nell'app. Argomenti passati bene per il mio test con MacVim. Considerando l'alias, ho dovuto creare l'alias di ogni comando nel cestino.

mvim README.txt
gvim Anotherfile.txt

Goditi la potenza di alias e PATH. Tuttavia, è necessario monitorare le modifiche quando il sistema operativo viene aggiornato.


"Ricorda che MacOS è basato su Linux". No, no, macOS e Linux non condividono una singola riga di codice. MacOS è un UNIX con un kernel basato su FreeBSD.
Thomas

Cambierà. Non voglio creare una guerra di religione. L'obiettivo era far sapere alla comunità che ci sono alcune potenti opzioni che gli utenti di MacOS possono utilizzare.
zerocog

Certo nessun problema! :)
Thomas,

0

Semplice, qui sostituisci "APP" con il nome dell'app che desideri avviare.

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

Grazie più tardi.


0

Puoi avviare le app utilizzando open:

open -a APP_YOU_WANT

Questo dovrebbe aprire l'applicazione che desideri.

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.