Inicie una aplicación en OS X con la línea de comandos

109

Quiero lanzar una aplicación en OSX desde un script. Necesito pasarle argumentos de línea de comando. Desafortunadamente, openno acepta argumentos de línea de comando.

La única opción que se me ocurre es utilizar nohup myApp > /dev/null &para iniciar mi aplicación para que pueda existir independientemente del script que la inicie.

¿Alguna sugerencia mejor?

psicotik
fuente
No puedo seguir la pregunta. "abrir" no acepta argumentos de línea de comandos? ¿Qué es "abierto"? ¿Es este el AppleScript abierto? ¿Cómo nohup &resuelve el problema?
S.Lott
4
man open (1) - comando de OS X para iniciar archivos o aplicaciones
Ned Deily
3
Esto debería estar en superuser.com
Jeff Meatball Yang

Respuestas:

78

En OS X 10.6, el opencomando se mejoró para permitir el paso de argumentos a la aplicación:

open ./AppName.app --args -AppCommandLineArg

Pero para versiones anteriores de Mac OS X, y debido a que los paquetes de aplicaciones no están diseñados para pasar argumentos de línea de comandos, el mecanismo convencional es usar Apple Events para archivos como aquí para aplicaciones Cocoa o aquí para aplicaciones Carbon. Probablemente también podría hacer algo torpe pasando parámetros al usar variables de entorno.

Ned Deily
fuente
Mi enfoque de kludgey es invocar el ejecutable directamente con argumentos de línea de comando usando nohup, si el entorno-vars-kludge es menos kludgey?
psychotik
2
Probablemente no. Si funciona para usted, hágalo. El punto más importante es que open (1) es el equivalente cli de lo que sucede cuando un usuario hace un doble clic o un "Abrir" en el Finder y ninguno de esos mecanismos admite argumentos de línea de comando convencionales.
Ned Deily
+1: No debería utilizar argumentos de línea de comandos para las aplicaciones GUI de Mac OS X.
S.Lott
2
dígale a Google que no use argumentos de línea de comando, Aplicaciones / 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. "¿Por qué?" ¿Leíste la respuesta? "El mecanismo convencional es usar Apple Events para archivos como aquí para aplicaciones Cocoa o aquí para aplicaciones Carbon". Así está diseñado Mac OS X. Si. Chrome rompe las reglas. Lo mismo ocurre con todas y cada una de las utilidades de la línea de comandos de Linux. Pero las aplicaciones GUI que se abren con open, como dice la respuesta, no están diseñadas para funcionar desde la línea de comandos. "¿Por qué?" Porque así es Mac OS X.
S.Lott
105

Como se mencionó en la pregunta aquí , el opencomando en 10.6 ahora tiene una argsbandera, por lo que puede llamar:

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

John McDonnell
fuente
Trabajando exactamente de la forma requerida. Gracias
DTdev
Esto funcionó y me permitió establecer un alias zsh para Chromium. Gracias
jamescampbell
Esta respuesta es genial. Solo quería agregar que cuando abra la Terminal por primera vez estará en su directorio de inicio, así que escríbalo de esta manera para que no tenga que cambiar al directorio de la aplicación. Quería ejecutar Gimp sin cargar las fuentes, lo que lleva una eternidad, así que escribo esto con el interruptor -f para omitir las fuentes: open -n /Applications/GIMP.app --args -f
James Toomey
32

Un paquete de aplicaciones (un .apparchivo) es en realidad un grupo de directorios. En lugar de usar openy el .appnombre, puede pasar a él e iniciar el binario real. Por ejemplo:

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

Ese es el binario real que podría aceptar argumentos (o no, en LittleSnapperel caso de).

NSSec
fuente
3
El binario acepta argumentos, estoy seguro. Yo lo escribi. Invocar 'abierto' no permite pasar argumentos. Estoy bastante seguro de esto. Y sí, mi secuencia de comandos está llamando a 'binario abierto' directamente, sin intentar abrir el paquete.
psychotik
@psychotik: No está diciendo que llames "binario abierto". Está diciendo que se ejecute directamente el binario.
Chuck
Eso no funcionará para mí. La ejecución directa del binario da como resultado que sea un proceso secundario de mi script, que definitivamente no quiero. De ahí la necesidad de utilizar open / nohup
psychotik
1
Si es un script de shell, use 'exec' para reemplazar el proceso del script con el ejecutable real.
Jonathan Leffler
2
Este enfoque tiene un gran inconveniente: si el paquete contiene las bibliotecas y los marcos personalizados, tendrá que jugar con DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

En caso de que su aplicación necesite trabajar en archivos (lo que normalmente esperaría pasar como :) ./myApp *.jpg, lo haría así:

open *.jpg -a myApp
eshedg
fuente
¡Este es exactamente lo que estaba buscando! Mi instanciación, por ejemplo: open something.py -a Eclipse.app
Eric
4

Recomendaría la técnica que ofrece MathieuK. En mi caso, necesitaba probarlo con Chromium:

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

Me doy cuenta de que esto no resuelve el problema del OP, pero espero que le ahorre tiempo a otra persona. :)

Paul irlandés
fuente
@Pacerier Agrega un `&` al final de este comando. Se iniciará en segundo plano. Luego puede cerrar la ventana de su terminal y la aplicación probablemente seguirá abierta.
Paul Irish
2

opentambién tiene un indicador -a, que puede usar para abrir una aplicación desde la carpeta Aplicaciones por su nombre (o por el identificador de paquete con el indicador -b). Puede combinar esto con la opción --args para lograr el resultado que desea:

open -a APP_NAME --args ARGS

Para abrir un video en el reproductor VLC que debería escalar con un factor 2x y un bucle, por ejemplo, debería ejecutar:

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

Tenga en cuenta que no pude obtener la salida de los comandos al terminal. (aunque no intenté nada para resolver eso)

rien333
fuente
¿Repetiste open -aintencionalmente? En cualquier caso, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllno me funciona.
Pacerier
Disculpe, mi sintaxis está completamente fuera de lugar por alguna razón. Actualizaré ahora.
rien333
2

Quería tener dos instancias separadas de Chrome ejecutándose, cada una con su propio perfil. Quería poder iniciarlos desde Spotlight , como es mi costumbre al iniciar aplicaciones de Mac. En otras palabras, necesitaba dos aplicaciones Mac regChromenormales , para la navegación normal y altChromepara usar el perfil especial, para iniciarlas fácilmente tecleando ⌘-espacio para abrir Spotlight, luego 'reg' o 'alt', luego Enter.

Supongo que la forma de fuerza bruta para lograr el objetivo anterior sería hacer dos copias del paquete de aplicaciones de Google Chrome con los nombres respectivos. Pero eso es feo y complica la actualización.

Lo que terminé con fueron dos aplicaciones de AppleScript que contienen dos comandos cada una. Aquí está el de 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 segunda línea inicia Chrome con el perfil alternativo (el --user-data-dir parámetro).

La primera línea es un intento fallido de dar a las dos aplicaciones iconos distintos. Inicialmente, parece funcionar bien. Sin embargo, tarde o temprano, Chrome vuelve a leer su archivo de icono y obtiene el correspondiente a la última de las dos aplicaciones que se inició, lo que da como resultado dos aplicaciones en ejecución con el mismo icono. Pero no me he molestado en intentar solucionarlo: mantengo los dos navegadores en escritorios separados y navegar entre ellos no ha sido un problema.

George
fuente
2

Comenzando con OS X Yosemite , ahora podemos usar AppleScript y Automator para automatizar tareas complejas. JavaScript para la automatización ahora se puede utilizar como lenguaje de programación.

Esta página ofrece un buen ejemplo de script de ejemplo que se puede escribir en la línea de comando usando bash y el modo interactivo osascript . Abre una pestaña de Safari y navega 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;
Mowzer
fuente
consulte Editor de secuencias de comandos / Ventana / Biblioteca para obtener una lista de aplicaciones que tienen disponible la automatización de AppleScript. Estaba buscando Vysor, basado en Chrome, y creo que necesito una forma diferente.
AnneTheAgile
Más complejidad ftw!
Pacerier
1

Con applecript:

tell application "Firefox" to activate
Keith
fuente
¿Cómo se pasan argumentos a Firefox? Por ejemplo, -no-remote -P "Otro perfil". Al desarrollar complementos y demás, es conveniente tener dos procesos de Firefox separados usando dos perfiles separados. Tu perfil normal y una caja de arena en la que depurar tu extensión.
George
Creo que se está refiriendo a una directiva de AppleScript, pero la pregunta es sobre la apertura desde la línea de comandos ...
conny
0

¿Por qué no establecer simplemente agregar ruta al contenedor de la aplicación? Para MacVim, hice lo siguiente.

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

Un alias, es otra opción que probé.

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

Con la ruta de exportación puedo llamar a todos los comandos en la aplicación. Los argumentos pasaron bien para mi prueba con MacVim. Mientras que el alias, tuve que asignar un alias a cada comando en el contenedor.

mvim README.txt
gvim Anotherfile.txt

Disfrute del poder de alias y PATH. Sin embargo, debe controlar los cambios cuando se actualiza el sistema operativo.

zerocog
fuente
"Recuerde que MacOS está basado en Linux". No, no, no lo es, macOS y Linux no comparten una sola línea de código. MacOS es un UNIX con un kernel basado en FreeBSD.
Thomas
Cambiará. No quiero crear una guerra religiosa. El objetivo era que la comunidad supiera que hay algunas opciones poderosas que los usuarios de MacOS pueden utilizar.
zerocog
¡Claro, no hay problema! :)
Thomas
0

Sencillo, aquí reemplace la "APLICACIÓN" por el nombre de la aplicación que desea iniciar.

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

Gracias luego.

Kiran Sk
fuente
0

Puede iniciar aplicaciones usando open:

open -a APP_YOU_WANT

Esto debería abrir la aplicación que desee.

usuario13549667
fuente