¿Cómo hacer una aplicación Mac OS X con un script de shell?

Intenté seguir algunos tutoriales, pero me sale esto:Error de PowerPC

¿Cómo puedo arreglar esto? Agregué un info.plist (simplemente copié y pegué el archivo de otra aplicación y cambié algunas cosas).

Además, solía chmod +x myApphacer que el script fuera ejecutable.

PD: estoy usando El Capitan

No podemos adivinar qué hiciste antes de recibir el mensaje de error. ¿Qué tutoriales seguiste, después de qué paso te quedaste atascado?
Creé una carpeta llamada myApp.app, luego una subcarpeta llamada Contenidos, luego MacOS, luego un script de shell de myApp que contiene #!/bin/bash ; say "Hi" ; exit 0(con cada uno de los comandos en diferentes líneas y sin el punto y coma).
Un script de bash que tiene un conjunto de bits de ejecución no necesariamente debe colocarse en un paquete para ejecutarse, simplemente haga doble clic en él si solo está en Finder o ejecútelo desde la Terminal. Si realmente desea un paquete de aplicaciones, créelo con AppleScript o Automator, el último de los cuales es fácil. Agregue una acción Ejecutar script de Shell y coloque su código en ella.
@ user3439894 Intenté automatizar con el método que describiste antes de publicar esto, pero la aplicación no se ejecutaría en la computadora de destino.
@ user3439894 Bueno, por alguna razón no puedo editar mi comentario anterior. El error era algo así como 'Este tipo de aplicación no es compatible con esta computadora'.
¿Es la computadora de destino en la que se creó la aplicación Automator y, de no ser así, por qué no puede simplemente crearla en la computadora de destino? ¿Por qué debe ser un paquete de aplicaciones? ¿Por qué no se puede ejecutar el script como se menciona en la primera oración de mi primer comentario?
@user3439894 No tengo acceso a la computadora de destino, ya que son mis amigos. Además, necesito que se abra al inicio.
¿Qué versión de OS X está en la computadora de destino?
@user3439894 Yosemite o El Capitán... no estoy seguro de cuál.

Respuestas (4)

Bueno, hace años que uso este sencillo truco para tener scripts de bash en la aplicación (y realmente no entiendo por qué todas las personas intentan soluciones tan complicadas como crear carpetas de "Contenido", info.plist o usar Automator o Platypus o algo así... . ????).

  1. Cree una carpeta llamada "SuAplicación.app". Se puede crear en cualquier lugar que sea conveniente para su uso. Sin embargo, las ubicaciones más compatibles con el sistema operativo pueden ser /Aplicaciones o su propia carpeta ~/Aplicaciones.
  2. Coloque su archivo de script directamente en esta carpeta de la forma que más le convenga (Finder, terminal, etc.). El script debe ser ejecutable, por supuesto (use chmod +x si lo necesita). No se necesitan otras carpetas o archivos (hasta que necesite llamar a otros scripts o ejecutables desde su script, por supuesto). El truco es nombrar su script exactamente con el mismo nombre que la carpeta de la aplicación pero sin extensión. En el caso descrito aquí, el archivo de script debe llamarse "SuAplicación".

Eso es todo ! Funciona en Mac os x desde Snow Leopard hasta Mavericks. Si alguien puede probar versiones más nuevas del sistema operativo y decirme.

Nota: El script debe tener un tamaño mínimo de 28 bytes, de lo contrario no se ejecutará. Puede rellenarse con líneas en blanco para lograr el tamaño mínimo. Además, la primera línea del guión debe ser un tinglado; por ejemplo #!/bin/basho #!/bin/perl.

[ACTUALIZAR]

Respondiendo a lo que se refiere el comentario de @DenisHowe, al usar este truco, si desea tener la ruta de la ejecución actual, puede agregar esas líneas al comienzo de la secuencia de comandos:

abspath () 
{ 
case "${1}" in 
    [./]*)
    local ABSPATH="$(cd ${1%/*}; pwd)/"
    echo "${ABSPATH/\/\///}"
    ;;
    *)
    echo "${PWD}/"
    ;;
esac
}


CURRENTPATH=`abspath ${0}`
PATH=$PATH:$CURRENTPATH
Intente agregar algunas líneas más, le da el mensaje que tenía si no hay suficientes líneas en su script.
Edité su respuesta para incluir la información crítica que falta y la voté.
OK, gracias por la corrección y la votación... He estado usando esto desde hace mucho tiempo y me olvidé de la necesidad de 28 bytes... No tengo ningún script tan pequeño, por supuesto: D
Acabo de probar esto en macOS Sierra y también funciona allí.
Está bien. Salud
¡Guau! ¡Eso funciona! No lo puedo creer. Muchas gracias. Editar: Probado en macOS Sierra
Bueno, no podía creer que nadie haya probado esta solución tan simple antes... Me alegro de que te haya funcionado.
Para cualquiera que intente esto, asegúrese de que la primera línea sea#!/bin/bash
@FlareCat De hecho, acabo de verificar y supongo que cualquier shebang con un intérprete existente servirá (intenté con perl). Si probaste otros idiomas, solo dilo ;).
¿Alguien sabe cómo obtener el script para cambiar el directorio de trabajo a la carpeta .app?
@bugloaf Encontré mi respuesta: stackoverflow.com/a/246128/214070
Para darle un ícono personalizado, haga Obtener información, seleccione el ícono en la esquina superior izquierda y luego pegue una imagen de 512x512.
@bugloaf: la mayoría de las veces uso este truco de secuencias de comandos para "encapsular" otras aplicaciones en un proceso (montar discos, administrar dispositivos, agentes, demonios o sincronizar antes de iniciar una aplicación, por ejemplo), así que simplemente uso la aplicación sustituida icono arrastrando el icono desde la aplicación de origen panel "Obtener información" icono de tamaño grande inferior a la aplicación de destino panel "Obtener información" icono de tamaño pequeño hacia arriba a la izquierda (el signo más debe aparecer cuando el mouse está sobre el icono pequeño y así puede pegar en este punto).
Para cualquiera que use macOS Mojave, puede usar el programa Automator incorporado para hacer esto. Simplemente use la acción Ejecutar script de Shell y luego guárdelo como una aplicación
¿Qué sucede si sudoes necesario ejecutar el script? ¿Qué puedo hacer para que el script le pida al usuario la contraseña?
@Royi Bueno, depende en gran medida del propósito y el comando que necesita para ejecutar como root. Puede llamar a una aplicación (abrir -a ...) que administre la escalación del administrador o puede usar el archivo /etc/sudoers y agregar los derechos requeridos para la aplicación/comando a la persona que llama/usuario (la mayoría de las veces su mac os id /usuario). Sin embargo, tenga cuidado con las preocupaciones de seguridad, romper los derechos de sudo no siempre es una buena manera de hacer las cosas. Busque "mac os sudoers" a través de google, probablemente encontrará muchas muestras (también hay algunas en el archivo).
@Steve Vermeulen: esta es otra solución, aunque ya se ha sugerido en otras respuestas y no es específica de Mojave. Esa es una característica antigua en mac Os Automator. Aunque esto no es tan simple y elegante para mi sentido. Solo es necesario si necesita pasar parámetros en ciertas circunstancias (pienso en las acciones de exportación de Lightroom, por ejemplo).
Yo especificaría que el YourApplication.appdebe estar cerado en/Applications
@Igor Fobia, no sé qué versión de sistema operativo está usando, pero este truco funciona desde cualquier ubicación, no solo /Aplicaciones, al menos en Mac Os High Sierra y anteriores.
Funciona bajo macOS Catalina también, gracias
Esto todavía parece funcionar con Big Sur. Sin embargo, pasar argumentos (por ejemplo, archivo para abrir) no funciona para mí. Esto parece funcionar solo con aplicaciones de Automator
@basbebe Gracias por tu informe. No puedo tener Big Sur por el momento para buscar una solución sobre los argumentos (mis dos Mac son demasiado viejas). Pero lo intentaré en cuanto pueda. Supongo que un vistazo a la documentación de "abrir" con --args puede dar más pistas.
abrir con --argsfunciona. pero, por ejemplo, abrir un documento con la aplicación creada da un error en la ventana del terminal: Unknown command: \Xca\Xfe\Xba\Xbe(también recibo este error si solo agrego la ubicación del archivo al comando)
@basbebe, de hecho, pero no estoy seguro de que sea específico de Big Sur, entonces. Para ser honesto, no uso ese truco de la aplicación de secuencia de comandos si necesito la funcionalidad de "arrastrar y soltar documentos", sino que uso Automator (a veces con una combinación).
Me encanta cómo la aplicación de sus secuencias de comandos hace que se ejecuten instantáneamente cuando se hace clic y les da una posición más destacada en Spotlight.
Cuando se ejecuta como una aplicación, su secuencia de comandos probablemente no tendrá el mismo entorno que cuando se ejecuta desde un shell interactivo. Por ejemplo, es posible que deba establecer la RUTA o especificar rutas absolutas de comandos.
@DenisHowe De hecho. He aquí un ejemplo de lo que suelo añadir al principio de los scripts: abspath () { case "${1}" in [./]*) local ABSPATH="$(cd ${1%/*}; pwd )/" echo "${ABSPATH/\/\///}" ;; *) echo "${PWD}/" ;; esac } RUTA ACTUAL= abspath ${0}RUTA=$RUTA:$RUTA ACTUAL:
¿Es posible mostrar la terminal y solicitar información usando esta solución? Logré ejecutar el script en la carpeta *.app pero quiero imprimir algunos valores y tomar algunas entradas de teclado.
@ user62013 En ese momento, uso Cocoadialog para lo que se puede instalar con macports (me temo que ahora no está muy bien documentado, ya que es un proyecto bastante muerto, pero aún funciona). También puede usar applescript para cuadros de diálogo y entradas simples. Por otro lado, en mi opinión, no es muy interesante usar la solución que di aquí (me refiero al script en la aplicación simple) para usar la terminal al final. Creo que será mejor que inicie directamente un script con terminal haciendo doble clic en él y luego utilícelo de forma estándar.
Crear una aplicación de esta manera no me permitió crear un archivo pkg, ¿es algo que requiere una estructura más complicada?
@ ngood97 ¿Puede ser más específico sobre lo que quiere decir con "crear un archivo pkg" (proceso, software usado, propósito)?
@PierreLagarde ¡Sí, seguro! El proceso que intentaba seguir está aquí: techrepublic.com/article/… -> sudo pkgbuild –ubicación-de-instalación /Aplicaciones –componente /Volumes/Google\ Chrome/Google\ Chrome.app ./Desktop/Google\ Chrome.pkg Por alguna razón, a la herramienta pkgbuild no le gusta esa estructura y da este error: pkgbuild: error: Path “<path x>/TestApplication.app" is not a valid bundle component (using destination path “<path x>”)No es demasiado importante, solo me gustaría un pkg mínimo para probar cosas.
De hecho, pude hacer un paquete mínimo usando esta guía: matthew-brett.github.io/docosx/flat_packages.html si alguien está buscando eso
@ ngood97 ok bien, y gracias por sus comentarios. Debo decir que solo estaba usando este truco egoístamente en mis propias Mac. Dado que es fácil simplemente llevar el texto bash a cualquier otra Mac y la aplicación se puede construir fácilmente en un sencillo proceso de bricolaje, nunca me pregunto cómo hacer un paquete para la entrega. Esa es una adición interesante seguro.
¿Cómo hacer que se muestre en el Dock?
@TSR Arrástrelo al Dock como cualquier otra aplicación.

La respuesta actualmente aceptada no me funciona del todo. Obtengo el pequeño ícono de la aplicación rota.

ingrese la descripción de la imagen aquí

Lo siguiente me funciona bajo OSX 10.15.7 (Catalina). Siéntase libre de cambiar YourApplicationel nombre que realmente desea en todas las instrucciones siguientes.

  1. mkdir un directorio con la .appextensión en la /Applicationscarpeta con ay Contentsluego MacOSsubdirectorios.

    mkdir -p /Applications/YourApplication.app/Contents/MacOS
    
  2. Mueva su secuencia de comandos a este directorio y asígnele el mismo nombre que la carpeta superior de la aplicación pero sin la .appextensión y sin la extensión de la secuencia de comandos de shell:

    mv yourscript.sh /Applications/YourApplication.app/Contents/MacOS/YourApplication
    
  3. Asegúrese de que su script sea ejecutable:

    chmod +x /Applications/YourApplication.app/Contents/MacOS/YourApplication
    

Aquí hay una aplicación de muestra para probar:

#!/bin/sh
result=`osascript -e 'display dialog "Should I beep?" buttons {"Yes", "No"}'`
if [[ "$result" = "button returned:Yes" ]]; then
    osascript -e 'beep'
fi

Su aplicación ahora debería estar lista y el script debería ejecutarse cuando haga doble clic en él. Es importante tener en cuenta que si cambia el nombre de la aplicación, deberá cambiar el nombre del script subyacente.


Hacer que LaunchPad viera su aplicación era más difícil de entender. Lo siguiente pareció funcionar. Debe agregar algo como lo siguiente en el /Applications/YourApplication.app/Contents/Info.plistarchivo. Es posible que también deba moverlo a un archivo DMG y volver a Aplicaciones para LaunchPad para notarlo. Ver: https://stackoverflow.com/a/71342335/179850

<?xml version="1.0" encoding="UTF-8" standalone="no"?><plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>My App</string>
    <key>CFBundleGetInfoString</key>
    <string>My App 1.0</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
</dict>
</plist>

Para agregar un ícono a su nueva aplicación, debe hacer lo siguiente:

  1. Busque o cree un PNG que desee que sea su icono.

  2. Abra la imagen en la aplicación Vista previa; otras aplicaciones de gráficos también pueden funcionar.

  3. Presiona comando-a para seleccionar todo y luego comando-c para copiarlo al portapapeles.

  4. Seleccione su aplicación en el Finder y presione comando-i para obtener información en la ventana.

  5. Haga clic en el icono en la esquina superior izquierda de la ventana de información para seleccionarlo:

    ingrese la descripción de la imagen aquí

  6. Pegue la imagen del portapapeles que debería cambiar el icono.

    ingrese la descripción de la imagen aquí

También puede abrir la ventana Obtener información en otra aplicación, seleccionar su icono y copiarlo para poder pegarlo en su nueva aplicación. Después de asignar cualquier ícono, si busca en su .appdirectorio, debería ver un nombre de archivo que comienza con Icon.

No es necesario tener todas esas carpetas en la aplicación. Simplemente coloque su script directamente en la carpeta raíz de la aplicación (es decir, /Aplicaciones/SuAplicación.app en su caso) y hágalo ejecutable. Solo necesita tener al menos 28 bytes de tamaño y tener un shebang, como debería tener cualquier script.
Todo esto está muy bien, y funciona como se describe, pero nada de eso lo hace visible para el Lanzador, que es la razón principal por la que quiero convertir mi secuencia de comandos en una "Aplicación" en primer lugar. ¿Alguien puede proporcionar ese último bit?
¿Qué es lanzador @q.undertow? ¿Te refieres a LaunchPad? ¿Quizás las instrucciones de aquí sobre cómo arrastrar su nueva aplicación al ícono de LaunchPad? appletoolbox.com/…
Sí, Launchpad, lo siento. Probaré ese enlace, pero no quiero meterme con el área del sistema/Aplicaciones; tengo mi script en ~/Aplicaciones. Tenía algunas aplicaciones descargadas allí y recuerdo que Launchpad no tuvo ningún problema con eso.
He agregado algunas instrucciones adicionales @q.undertow. Mi aplicación ahora aparece en Launchpad. Ve si funciona para ti.
@all Perdón por la respuesta tardía, pero no me notificaron sus preguntas porque estaban en otro hilo. Simplemente puede agregar el archivo info.plist directamente en la carpeta YourApplication.app. No hay necesidad de subcarpetas, como ya se dijo para el script. De esa forma, se mostrará en la lista de Launchpad como cualquier otra aplicación. Todavía estoy usando esto en Monterey. Puedo ayudarte si algo te sale mal, solo avísame aquí :D. La única limitación es pasar argumentos. En su lugar, deberá crear una aplicación Automator para eso.

Si se trata de un simple script de shell, entonces no necesita envolverlo en un paquete de aplicaciones; puede hacer doble clic en el propio script. Sin embargo, no podrá tener un ícono personalizado u otras cosas por el estilo.

Creo que hay algunos ayudantes que pueden envolver scripts simples, pero el único con el que tengo experiencia es Platypus , que le permite hacer que los scripts de shell/python/perl/ruby/etc se ejecuten como aplicaciones normales con íconos, I/ O redirecciones, etc.

Donde Platypus difiere aquí es que PUEDE obtener STDIN / STDOUT a través de algunos mecanismos diferentes, así como la interactividad de la barra de menú. Entonces obtiene una ventana donde puede interactuar con cualquier script que se esté ejecutando.

Platypus parece no ser utilizable desde la línea de comando (que es probablemente donde está su script de shell).

Este script https://github.com/andrewp-as-is/mac-appify que se puede instalar con pip para usuarios de python ( pip install mac-appify) parece llevar a cabo los pasos de la respuesta anterior .

Puede ser útil así

pip install mac-appify
appify script.sh  /Applications/$NAME.app