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

60

¿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 quiosco o 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 agregar los argumentos a las propiedades de acceso directo, pero como las Mac no usan el acceso directo per se y ejecutan las aplicaciones directamente, esto no es posible.

He descubierto que iniciar 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 que estos sean ejecutables y asignar un icono y todo funciona muy bien, excepto que cuando ejecuto cualquiera de estos pseudo programas, una ventana de terminal o un icono de Applescript permanece abierto mientras la aplicación esté abierta. Presumiblemente, usar el comando Applescript openevitaría esto, pero como no estoy ejecutando la aplicación ya que está empaquetada (solo /Applications/Firefox), no funciona.

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

Editar

Según una página de Mozilla Wiki , es mejor usar un script para ejecutar la aplicación con argumentos. Agregar un &al final del script mata la ventana de Terminal persistente. La única molestia ahora es que abre una ventana de Terminal muerta y desconectada (que es mejor que la persistente, pero aún así ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
Andrés
fuente
2
Todavía espero mejores respuestas en este ...
cregox
Cuando ejecuta un trabajo con &él todavía pertenece a la Terminal, puede arreglarlo agregando la línea disown %/Applications/Firefox.app/Contents/MacOS/firefox después de ejecutarlo, luego puede cerrar la Terminal de manera segura, utilizando AppleScript.
ocodo
busque la respuesta de Daniel: es la más completa y perfecta para hoy (OSX 10.6.2 +).
cregox

Respuestas:

17

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 .

Puede poner cualquier aplicación con cualquier argumento en la primera parte. La parte posterior a la &necesidad de matar lo que sea que haya llamado su script + .app. Verá que la aplicación de script parpadea en el muelle, pero luego desaparecerá.

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

MJeffryes
fuente
Casi funciona. Todavía está esperando que se realice la instancia de Firefox hasta que ejecute killall, por lo que llama al depurador cuando cierro Firefox, y la aplicación de script aún no desaparece. Hmmm ...
Andrew
Eso es raro. ¿Lo guarda como una aplicación y luego hace doble clic en la aplicación? No funcionará cuando se ejecute desde Script Editor.
MJeffryes
Además, noté que puse una nueva línea antes del &. Elimine la nueva línea si la tiene
MJeffryes
no hay necesidad de & killall aquí en Snow Leopard 10.6.x, pero tampoco pudo encontrar ninguna manera de hacer que la aplicación se matara a sí misma tan pronto como se ejecuta.
cregox
1
@Pacerier Verifique las fechas en esta respuesta.
MJeffryes
28

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

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

Eso debería darte todo el comportamiento que deseas.

Mover
fuente
"hombre abierto", y ahí está! trabajado como un encanto. --args flag y luego tus argumentos.
Michael Dimmitt
1
Intenté --argscon Chrome y no funciona. Solo funcionará para la primera instancia . Si intenta ejecutar dos --user-data-dirsimultáneamente, no puede hacerlo, openpero debe ejecutarlo con el /applications...método anterior. Alguien sabe por qué mierda --args no funciona?
Pacerier
1
@Pacerier, "open -n"
Simon Wright
Para agregar a esto, puede crear el script en Script Editor y luego guardarlo como aplicación.
Kevin C.
11

Abra Automator y cree una aplicación con una sola acción Ejecutar script de Shell :

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

Esta aplicación iniciará Firefox y se cerrará instantáneamente, dejando solo Firefox ejecutándose.


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

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

Ambos funcionan bien y no mantienen ni Terminal ni una aplicación de script ejecutándose durante más de un segundo más o menos. Con Automator, incluso puede crear un Servicio si así lo elige.

Daniel Beck
fuente
1
Solo tenga en cuenta que open --argsse implementó en 10.6.2, como ya mencionó Bob.
cregox
Utilizándolo para: open eclipse.app -npara abrir un segundo espacio de trabajo de Eclipse. Muy útil. ¡Gracias!
jonalv
No se pudo hacer que funcione en Automator con la acción "Ejecutar script de Shell" en MacOS 10.14. Sin embargo, terminé teniendo éxito con el AppleScript.
Kevin C.
8

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 script de Apple:

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 el primero ya está abierto. (Si ejecuto el AppleScript anterior, luego otro con "Perfil 2", Chrome seguirá abriendo otra ventana como "Perfil 1"). :(

usuario1722483
fuente
¿Es -b funcionalmente igual a -a? ¿En qué se diferencian?
Pacerier
7

No es necesario (como han sugerido algunas otras respuestas) usar killall (o similar) para eliminar 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 de applet principal (por ejemplo, otros, ejecutando simultáneamente aplicaciones AppleScript (si se usa "applet" como patrón).

Algo así kill $PPIDpodría ser más razonable, pero es posible que no queramos asumir que el applet de una aplicación AppleScript es siempre el padre inmediato del shell iniciado por do shell script . Afortunadamente, hay una manera perfectamente razonable de hacer lo que necesita.

Según TN2065 (en "Quiero iniciar un proceso de servidor en segundo plano; ¿cómo hago para que el script de shell no espere hasta que se complete el comando?"), 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 AppleScript:

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

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

Funcionará lo suficiente como para iniciar Firefox y saldrá limpiamente mientras Firefox continúa ejecutándose.

La redirección es necesaria porque el script de shell no solo espera a que salga su elemento secundario inmediato (el shell), sino que también espera (todos los casos de) los extremos grabables de las tuberías que crea para que stdout y stderr del shell se cierren . Los programas que ejecuta sin redireccionamiento heredan el stdout y el stderr ( hacer las canalizaciones del script de shell ) (incluso los que se ejecutan en segundo plano con &); La redirección asegura que el caparazón sea el último en sujetar los extremos grabables de las tuberías. Por lo tanto, el script do shell volverá inmediatamente después de que el shell salga, permitiendo que la aplicación AppleScript salga (ya que el script do shell es la última expresión en el programa AppleScript).

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

Chris Johnsen
fuente
esto es muy interesante. Me pregunto si funciona antes de 10.6.2 ... pero sigo pensando que el uso se open --argsve más limpio. ¿Hay algún inconveniente en usar alguno de ellos?
cregox
1
Sé que este método funciona en 10.4. Mi impresión es que el script de shell siempre ha funcionado así (se agregó al Standard Additions OSAX en AppleScript 1.7 , que vino con Mac OS X 10.1). Si está dispuesto a asumir 10.6, entonces open --argsprobablemente esté bien.
Chris Johnsen
@ChrisJohnsen, Link down ........
Pacerier
4

AppleScript

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

Dos puntos allí.

  1. El espacio se escapa por una barra diagonal inversa que se escapa por la barra diagonal inversa 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

anónimo
fuente
applet¿se refiere a?
Pacerier
3

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

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

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

Dav
fuente
No hay clave de args en la lista, desafortunadamente. Según Mozilla, se supone que debes usar un script - wiki.mozilla.org/MailNews:Logging#Mac
Andrew
Tenga en cuenta también que cambiar el contenido del paquete (como Info.plist) puede causar problemas con la firma del código: bridge.grumpy-troll.org/2011/01/…
drevicko
2

Envuelva su aplicación dentro de un lanzador 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. Llegué a esa aplicación en el Finder, haga clic con el botón derecho y muestre el contenido del paquete.

  3. Coloque 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 su iniciador de aplicaciones.

Notas:

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

¿Por qué no usas:

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

Simple pero funciona.


fuente
2
La terminal se abrirá si haces eso.
MJeffryes
0

El opencomando tiene un --argsargumento opcional cuyo valor se pasará a la aplicación abierta como argumentos. Por ejemplo:

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