it-swarm.dev

¿Cómo puedo ejecutar una aplicación con argumentos de línea de comandos en Mac OS?

¿Hay alguna manera fácil de agregar argumentos de línea de comandos a una aplicación en una Mac? Por ejemplo, para ejecutar Opera en modo kiosco o para usar un perfil diferente en Firefox, puedo escribir

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

En Windows puedo adjuntar los argumentos a las propiedades del acceso directo, pero como las Mac no usan el acceso directo en sí y no ejecutan las aplicaciones directamente, esto no es posible.

He descubierto que el lanzamiento de las aplicaciones a través de bash o Applescript funciona parcialmente:

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

Puedo hacer estos ejecutables y asignar un ícono y todo funciona bien, excepto que cuando ejecuto cualquiera de estos pseudo programas, una ventana de terminal o un ícono de Applescript permanecen abiertos mientras la aplicación esté abierta. Es de suponer que usar el comando Applescript open evitaría esto, pero como no estoy ejecutando la aplicación porque está empaquetada (solo /Applications/Firefox), no funciona.

Entonces, ¿hay una mejor manera de ejecutar aplicaciones con argumentos de línea de comandos? De no ser así, ¿hay alguna manera de evitar que una sesión de terminal persistente o el ícono de Applescript permanezcan abiertos mientras la aplicación está abierta?

Editar

De acuerdo con una página de Wiki de Mozilla , es mejor usar un script para ejecutar la aplicación con argumentos. Agregar un & al final de la secuencia de comandos mata la ventana de Terminal persistente. La única molestia ahora es que abre una ventana de Terminal cerrada, cerrada (lo cual es mejor que la persistente, pero aún así ...)

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

Aquí está mi mejor solución: crear un Applescript con:

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

Y guárdelo como una aplicación .

Puedes poner cualquier aplicación con cualquier argumento en la primera parte. La parte posterior al & debe eliminar cualquier cosa que haya nombrado como su script + .app. Verás que la aplicación de script se activa en el dock, pero luego desaparecerá.

Nota: la secuencia de comandos no funcionará correctamente cuando se ejecuta desde el Editor de secuencias de comandos, solo cuando se ejecuta desde la aplicación de secuencia de comandos que ha creado.

16
MJeffryes

A partir de OS X 10.6.2, el comando de apertura puede pasar argumentos a la aplicación que se abre mediante el indicador --args. Un AppleScript para usarlo se parece a esto:

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

Eso debería darte todo el comportamiento que quieras.

25
Bob

Abra Automator y cree una Aplicación con una sola Ejecute el script de shell acción:

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

Esta aplicación iniciará Firefox y se cerrará instantáneamente, dejando solo a Firefox en ejecución.


Alternativamente, cree una aplicación usando Editor de AppleScript con el siguiente código de AppleScript:

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

Ambos funcionan bien y no mantienen el Terminal o una aplicación de script en ejecución por más de un segundo. Con Automator, incluso puede crear un servicio si así lo desea.

11
Daniel Beck

Esta es una discusión antigua, pero aún aparece en las búsquedas de Google, así que pensé en agregar un par de ¢.

Probablemente sea mejor usar un "identificador de paquete" en lugar de una ruta absoluta al ejecutable:

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

O en un Apple Script:

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

Lo que aún no he descubierto es cómo abrir una nueva instancia/ventana con un perfil diferente una vez que la primera ya está abierta. (Si ejecuto el AppleScript anterior, luego otro con "Perfil 2", Chrome seguirá abriendo otra ventana como "Perfil 1"). :(

8
user1722483

No es necesario (como han sugerido otras respuestas) usar killall (o similar) para matar el proceso de aplicación AppleScript principal ("applet") en este escenario. Incluso puede tener efectos secundarios adversos si el nombre/patrón dado a killall coincide con algo más que el proceso del applet principal (por ejemplo, otras aplicaciones de AppleScript que se ejecutan simultáneamente) el patrón)).

Algo como kill $PPID puede ser más razonable, pero no queremos asumir que el applet de una aplicación AppleScript es siempre el elemento primario inmediato del Shell iniciado por do Shell script . Por suerte, hay una manera perfectamente razonable de hacer lo que necesita.

Por TN2065 (en "Quiero iniciar un proceso de servidor en segundo plano; ¿cómo hago para que el script de Shell no espere hasta que finalice el comando?"), El el método adecuado es redirigir stdout y stderr y hacer que el Shell ejecute el programa en segundo plano.

Use Script Editor para guardar el siguiente programa como una aplicación de AppleScript:

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

(Se agregaron saltos de línea funcionales para mantenerlo "estrecho"; elimine ¬ y \\ y colóquelo todo en una línea larga si lo desea)

Se ejecutará el tiempo suficiente para iniciar Firefox y se cerrará limpiamente mientras que Firefox continúa ejecutándose.

La redirección es necesaria porque no solo el script del Shell espera a que finalice su hijo inmediato (el Shell), sino que también espera (todas las instancias de) los fines grabables del Tubos que crea para que el stdout y el stderr de Shell se cierren. Los programas que se ejecutan sin redirección heredan stdout y stderr de Shell ( las secuencias de comandos de Shell ) (se ejecutan incluso en segundo plano con &); la redirección garantiza que el Shell sea el último en contener los extremos de escritura de los conductos. Por lo tanto, el script de Shell volverá inmediatamente después de que el Shell se cierre, permitiendo que la aplicación AppleScript salga (ya que hace el script de Shell Es la última expresión en el programa AppleScript).

Las otras respuestas que usan open inside hacen que el script de Shell funcione porque open ( en realidad, LaunchServices) realiza el trabajo equivalente de poner en segundo plano el programa resultante y enviar su stdout y stderr a otra parte.

7
Chris Johnsen

AppleScript

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

Dos puntos allí.

  1. El espacio se escapa mediante una barra invertida que se escapa de nuevo
  2. el applet de killall puede causar problemas, porque puede haber otros applets ejecutándose
  3. Guárdalo como programa

Sin embargo, funciona bien en 10.6.5

4
anonymous

Lo siguiente debería permitirle especificar argumentos de línea de comando para el propio .app:

Haga clic con el botón derecho en el paquete .app, seleccione "Mostrar contenido del paquete", navegue hasta Info.plist, haga doble clic en él, encuentre la clave Args, edite.

No tengo una máquina OS X a la mano en este momento, así que no puedo verificar si también podría hacer esto con un alias (si quisiera mantener el .app libre de argumentos original, etc.).

2
Dav

Envuelve tu aplicación dentro de un lanzador de AppleScript.

Aquí están los pasos.

  1. Cree un AppleScript con el siguiente contenido y guárdelo como una aplicación (en este ejemplo se llama "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. Llegó a esa aplicación en el Finder, haga clic derecho, muestre el contenido del paquete.

  3. Ponga su aplicación en la raíz del contenido del paquete. (En este ejemplo sería "Firefox 3.app")

    Resultado: /Aplicaciones/Firefox 3 launcher.app/Firefox 3.app

  4. Ahora puede abrir el iniciador de su aplicación.

Notas:

  • Las actualizaciones automáticas de la aplicación ajustada deberían funcionar en la mayoría de los casos.
  • Debería ser posible arrastrar y soltar al lanzador redirigido automáticamente a la aplicación envuelta (con un poco más de scripting).
  • El iniciador se cierra automáticamente después de que se inicie la aplicación envuelta.
  • Una ventaja de este método es que hay pocos riesgos de abrir la aplicación envuelta directamente.
2
jlgrall

El comando open tiene un argumento opcional --args que el valor se pasará a la aplicación abierta como argumentos Por ejemplo:

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