10 votos

Cómo crear un OSX Aplicación para envolver una llamada a un script de shell?

Mi objetivo es incluir en un archivo zip lo que equivale a un acceso directo, en lugar de decirle a mi cliente(s) para abrir Terminal y ejecutar una secuencia de comandos de shell.

Mi desplegables en esencia se parece a esto:

$ unzip Deliverable.zip 
$ cd Deliverable; ls
app.jar run.sh

La secuencia de comandos en run.sh:

#!/bin/sh
java -jar app.jar

Hay mucho más en el directorio; baste decir que necesita para ejecutar la secuencia de comandos desde el directorio de Entrega ya que la necesito para acceder a las rutas de acceso relativas. Sin embargo, no puedo garantizar que a un cliente se va a abrir Deliverable.zip (podría ser el hogar de directorio, podría estar en el directorio de Descargas de, etc.)

He encontrado este que describe cómo crear un nuevo flujo de trabajo de Automator, a continuación, guárdelo como una aplicación para que se ejecute una secuencia de comandos de shell. Traté de hacer eso, para envolver run.sh pero dice que no puede encontrar run.sh.

Alguien me sugirió utilizar applescript y también me envió un enlace a cómo utilizar applescript para cambiar en el directorio actual; hay un applescript "acción" en automator; así que he hecho un nuevo flujo de trabajo con que, y se guarda como una aplicación. Esto es lo que parece:

the automator applescript program

El código:

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me) as alias
    end tell

    do shell script "java -jar app.jar" 

    return input
end run

Y este es el error cuando lo ejecuto:

welcome to 2015

Vamos, esto debería ser bastante simple. Lo que estoy haciendo mal aquí?

7voto

Malik hassan Puntos 16

Puedo ver un par de cosas mal allí.

En primer lugar, han abierto un flujo de trabajo y no una Aplicación.

Usted debe elegir la Aplicación al hacer su selección para el tipo de Automator archivo.

enter image description here

Y el código no funcionará como se espera, ya que no han cambiado de directorio. (cd).

En el código de como lo tienes, todo lo que está haciendo es obtener la ruta de acceso como un alias y la almacena en la variable current_path y en un formato inadecuado para los comandos de unix.

Pero no lo va a utilizar.

Por lo que el directorio actual más probable es que sea tu carpeta de inicio

En esta etapa no es contar lo que está tratando de lanzamiento.

Si lo ejecuto como usted lo tiene que me pasa.

enter image description here

Lo cual tiene sentido ya que no tengo el Java instalado. Pero si lo hiciera yo no esperaría encontrar el archivo correcto.

La necesidad de Applescript para este aspecto.

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me) as alias
    end tell

    do shell script "cd " & quoted form of (POSIX path of current_path) & " ;ls | open -fe"

    return input
end run 

En mi ejemplo

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;/bin/ls | /usr/bin/open -fe"

I cd a la ruta de acceso POSIX de los alias en la variable current_path

yo.e de "alias "Macintosh HD:Aplicaciones:"" "/Aplicaciones/"

El quoted form of escapa de la ruta de acceso el uso de comillas.

He utilizado el /bin/ls mando y la tubería para el abierto en el editor de texto stdin como una demostración aquí, así que usted puede probar para ver si usted puede llegar a la zona de espera.

Usaría algo como;

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\""

actualización:

Otra forma es simplemente el uso puro de Applescript.

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me)

        set theFile to (current_path) as alias

        open file "java -jar app.jar" of theFile
    end tell


end run

5voto

Steve Evans Puntos 155

Camino a la secuencia de Comandos

En su AppleScript, usted necesita para cambiar el directorio de trabajo actual (cwd) antes de emitir el comando java. Hacer esto con un AppleScript línea como:

do shell script "cd " & quoted form of (POSIX path of file_path) & " && java -jar app.jar"

El && es importante. Si el cd se realiza correctamente, el java comando será lanzado dentro de la derecha cwd. Si cd falla, el java comando no se ejecutará.

Los problemas que probablemente encontrará incluyen:

  • escapando de la ruta de acceso POSIX pasó a cd; los usuarios tendrán extraño nombre de las carpetas y de los espacios en sus caminos.
  • el cd puede fallar; envolver tu AppleScript en intentar bloquear para coger algunos errores y advertir al usuario.

perl

Personalmente, creo que sería la envoltura de una corta secuencia de comandos perl en lugar de una secuencia de comandos bash.

#!/usr/bin/env perl

use strict;
use warnings;
use FindBin qw($Bin); # $Bin is a path to the script's parent folder

`cd "$Bin" && java -jar app.jar`;

Hay formas mucho mejores de escribir este fragmento de código en perl, pero esto debería funcionar.

Aplicación Automator

El mejor enfoque es trabajar a través de problemas con su Automator enfoque. @markhunte la respuesta describe cómo arreglar el camino y crear una aplicación. Este debe obtener la mayor parte del camino.

Ver también AppleScript ruta de acceso relativa a la ubicación del script.

appify a crear el más simple posible Mac app desde un script de shell

Como alternativa, puede utilizar Thomas Aylott del appify script para agrupar el script de shell en un sistema operativo X de la aplicación. Mathias Bynen del artículo camina a través de cómo utilizar la secuencia de comandos, cómo crear sencillas aplicaciones de Mac a partir de secuencias de comandos de shell.

#!/bin/bash

if [ "$1" = "-h" -o "$1" = "--help" -o -z "$1" ]; then cat <<EOF
appify v3.0.1 for Mac OS X - http://mths.be/appify
Creates the simplest possible Mac app from a shell script.
Appify takes a shell script as its first argument:
    `basename "$0"` my-script.sh
Note that you cannot rename appified apps. If you want to give your app
a custom name, use the second argument:
    `basename "$0"` my-script.sh "My App"
Copyright (c) Thomas Aylott <http://subtlegradient.com/>
Modified by Mathias Bynens <http://mathiasbynens.be/>
EOF
exit; fi

APPNAME=${2:-$(basename "$1" ".sh")}
DIR="$APPNAME.app/Contents/MacOS"

if [ -a "$APPNAME.app" ]; then
    echo "$PWD/$APPNAME.app already exists :("
    exit 1
fi

mkdir -p "$DIR"
cp "$1" "$DIR/$APPNAME"
chmod +x "$DIR/$APPNAME"

echo "$PWD/$APPNAME.app"

La comunidad ha contribuido la mejora de esta secuencia de comandos están disponibles:

La Firma De Código

Una vez creado el paquete de la aplicación, que debe ser de código firmado. Una firma de código de la aplicación se iniciará sin necesidad de sus clientes para deshabilitar el Portero.

Firmar el código de la aplicación con tu Apple ID de Desarrollador y el codesign comando:

codesign -s <identity> -v <code-path> …

La firma de código es una tecnología de seguridad, utilizado en OS X, que permite certificar que una aplicación fue creada por usted. Una vez que una aplicación no está firmada, el sistema puede detectar cualquier cambio en la aplicación-si el cambio es introducido de forma accidental o por código malicioso.

Aprender más acerca de firma de código en el sitio para Desarrolladores de Apple.

4voto

siva Puntos 23

Cambiar el nombre de tu .sh archivo .comando y se puede cd al directorio que el .archivo de comandos se encuentra en la siguiente al principio del archivo:

cd "$(dirname $BASH_SOURCE)"

4voto

forquare Puntos 841

Usted puede cambiar el run.sh a run.command y conseguir que el usuario haga doble clic en él?

1voto

SPRBRN Puntos 1008

Aquí está mi opinión sobre lo que he entendido usted está tratando de lograr. El código es de largo aliento, en fin.

Todo lo que necesitas hacer es copiar el código en el Editor Applescript, realice los cambios que desee y guardar como una aplicación.

Como para el diálogo sobre PowerPC aplicación no se admite, no sé. Se puede ejecutar desde la línea de comandos? Me gustaría comprobar que para confirmar la aplicación funciona a la primera.

#
# STEP 1: locate and confirm zip file exists
#
#   This is long winded on purpose. It is meant to save the user some scrolling and 
#   and a click... Isn't this what computers are for to save time? :)
#

# Zip file name 
set zipname to "Deliverable.zip"

# Locate the zip file
set zippath to POSIX path of (choose folder)
log zippath
set qzippath to quoted form of zippath
log qzippath
set zipfile to (zippath & zipname)
set qzipfile to quoted form of (zippath & zipname)
log qzipfile

# Check for the file... Use either test not both :)
try
    # using shell test - case sensetive
    do shell script "test -f " & qzipfile

    # using native test - doesn't like quoted forms and case insensetive...
    POSIX file zipfile as alias
on error
    display dialog "ERROR: Zip file was not found at selected folder." as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Alert"
    return
end try


#
# STEP 2: Zip found. Unzip it
#
try
    # Add " -d Deliverable" at the end to force directory  
    # unzip -o to force overwrite for testing....
    do shell script "cd " & qzippath & "; unzip -o " & zipname
on error eStr
    display dialog "ERROR: Failed to unzip file. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Unzip Error"
    return
end try


#
# STEP 3: Run script 
#
set dpath to (zippath & "Deliverable/")
log dpath
set qdpath to quoted form of dpath
log qdpath
try
    do shell script "cd " & qdpath & ";  sh ./run.sh"
on error eStr
    display dialog "ERROR: Failed to launch script. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Deliverable Script Launch"
    return
end try

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X