1 votos

¿Puedo manejar el evento Apple "open" dentro de un shell bash script usando el comando osascript?

Utilizo un bash script (myJavaBash.sh) dentro de un Application Bundle (myJavaJar.app), que inicia "java -jar myJarFile.jar" con argumentos adicionales de la JVM (que funciona bien hasta ahora). Mi objetivo es pasar un nombre de archivo como argumento a la aplicación, también, cada vez que el usuario abre un archivo a través de "abrir con ... miJavaJar.app".

Editar: para aclarar: no paso argumentos al bash script. Quiero que el bash script obtenga los nombres de los archivos de donde pueda para pasar el primero de ellos a miJarFile.jar.

Intenté implementar OpenFilesHandler en la aplicación java y a copiar un archivo AppleScript-scpt en el paquete que llama a myJavaBash.sh sin éxito.

Lo último que probé sólo por probar todas las posibilidades fue llamar a osascript dentro del bash

#!/bin/bash

#test: set command line args
MY_TITLE="Launching myJavaJarApp"
ARGS_MSG="command line args: "

osascript <<-EndOfScript
    set arguments to ""
      on open theFiles
            repeat with anItem in theFiles
               set arguments to arguments & space & (quoted form of POSIX path of anItem)
            end repeat
      end open
    display dialog "$ARGS_MSG" & arguments with title "$MY_TITLE"     
EndOfScript

No funcionó, el diálogo sólo indica $ARGS_MSG y ningún argumento, cuando abro un archivo con el myJavaJar.app.

Me parece que establecer el bash-script como CFBundleExecutable "consume" todos los AppleEvents.

¿O hay alguna manera?

Editar : Este es el bash completo script. La primera versión la obtuve de Vídeo de YouTube de Sri Harsha Chilakapati "Cómo empaquetar archivos JAR de Java en aplicaciones de Mac" y lo editó para que averigüe las versiones de Java instaladas y elija la más adecuada. También inicia la JVM con parámetros adicionales si la versión de Java es > 1.8 para enlazar las clases JAXB.

#!/bin/bash

# Constants
JAVA_MAJOR=1
# treat Java 1.8 other than Java 9
JAVA_MINOR=8
JAVA_MINOR_A=9
# Java higher than 10.x doesn't have java.xml.bind any more
JAVA_MAJOR_MAX=10
java_supported_versions=(1.8 9 10)
LIB_EXEC="/usr/libexec/java_home -v"
APP_JAR="myJarFile.jar"
APP_NAME="Setrok's Java Application"
APP_ICNS="myIcons.icns"
# different arguments for Java 1.8 than 1.9
VM_ARGS=""
VM_ARGS_A="--add-modules=java.xml.bind"

# Set the working directory
DIR=$(cd "$(dirname "$0")"; pwd)

#test: set command line args
MY_ARGS="$1"
ARGS_MSG="command line: $MY_ARGS"

osascript <<-EndOfScript
      set arguments to ""
      on open theFiles
             repeat with anItem in theFiles
               set arguments to arguments & space & (quoted form of POSIX path of anItem)   
             end repeat
      end open 
      display dialog "$ARGS_MSG" & arguments & "$MY_ARGS" with title "$ERROR_TITLE"
EndOfScript
#end test

# Error message for NO JAVA dialog
ERROR_TITLE="Cannot launch $APP_NAME"
ERROR_MSG="$APP_NAME requires Java version $JAVA_MAJOR.$JAVA_MINOR up to $JAVA_MAJOR_MAX to run."
DOWNLOAD_URL="https://www.oracle.com/java/technologies/javase-jre8-downloads.html"

# Is Java installed?
if type -p java; then
    _java="java"
elif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
    _java="$JAVA_HOME/bin/java"
else
    osascript \
    -e "set question to display dialog \"$ERROR_MSG\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
    -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
    echo "$ERROR_TITLE"
    echo "$ERROR_MSG"
    exit 1
fi

# Java version check
if [[ "$_java" ]]; then
    version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')

    # Is version too high or too low?
    # Are there other (supported) java versions installed?
    if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR" ]] ||  [[ "$version" > "$JAVA_MAJOR_MAX" ]]; then
        for i in "${java_supported_versions[@]}";
        do
            java_other=$($LIB_EXEC "$i")
            _java="$java_other/bin/java"
            version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
            if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR" ]] ||  [[ "$version" > "$JAVA_MAJOR_MAX" ]]; then
                echo "Java Version does not match: $i"
            else
                break
            fi
        done
    fi

    ur_version="Your Java version is $version!"
    # Is version still too high or too low?
    if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR" ]] ||  [[ "$version" > "$JAVA_MAJOR_MAX" ]]; then
        osascript \
        -e "set question to display dialog \"$ERROR_MSG $ur_version\" with title \"$ERROR_TITLE\" buttons {\"Cancel\", \"Download\"} default button 2" \
        -e "if button returned of question is equal to \"Download\" then open location \"$DOWNLOAD_URL\""
        echo "$ERROR_TITLE"
        echo "$ERROR_MSG"
        echo "$ur_version"
        exit 1
    fi
fi

# Run the application  -cp ".;$DIR;" -cp ".;$DIR;"
if [[ "$version" < "$JAVA_MAJOR.$JAVA_MINOR_A" ]]; then
    exec $_java $VM_ARGS -Dapple.laf.useScreenMenuBar=true -Dcom.apple.macos.use-file-dialog-packages=true -Xdock:name="$APP_NAME" -Xdock:icon="$DIR/../Resources/$APP_ICNS" -jar "$DIR/$APP_JAR"
else
    exec $_java $VM_ARGS_A -Dapple.laf.useScreenMenuBar=true -Dcom.apple.macos.use-file-dialog-packages=true -Xdock:name="$APP_NAME" -Xdock:icon="$DIR/../Resources/$APP_ICNS" -jar "$DIR/$APP_JAR"
fi

Edición: Me olvidé de dar el Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>German</string>
    <key>CFBundleDisplayName</key>
    <string>Setrok's Java Application</string>
    <key>CFBundleIdentifier</key>
    <string>eu.gronos.myJavaJar</string>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>skktx</string>
            </array>
            <key>CFBundleTypeIconFile</key>
            <string>myIcons.icns</string>
            <key>CFBundleTypeName</key>
            <string>myJavaJar calculation</string>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
            <key>LSHandlerRank</key>
            <string>Owner</string> 
        </dict>
    </array>
    <key>CFBundleExecutable</key>
    <string>myJavaBash.sh</string>
    <key>CFBundleIconFile</key>
    <string>myIcons.icns</string>
    <key>CFBundleGetInfoString</key>
    <string>Setrok's Java Application (C) 2014-2020 (GPL)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>0.6.0</string>
    <key>CFBundleSignature</key>
    <string>xmmd</string>
    <key>CFBundleVersion</key>
    <string>0.6.0</string>
    <key>NSAppleScriptEnabled</key>
    <string>YES</string>
    <key>NSHumanReadableCopyright</key>
    <string>Setrok's Java Application (C) 2014-2020 (GPL)</string>
</dict>
</plist>

1voto

red_menace Puntos 111

Argumentos a favor de un sistema autónomo osascript se pasan como una lista de cadenas a AppleScript run por ejemplo on run argv - ver el página man de osascript . Si está utilizando osascript dentro de otro script, puede limitarse a utilizar los argumentos que ya tiene - expandiendo variables en un heredoc, por ejemplo.

El siguiente ejemplo utilizará los argumentos de la línea de comandos, o si no hay ninguno, de una matriz definida en el shell script. Los argumentos están separados por una nueva línea, que es utilizada por el AppleScript para obtener la lista:

#!/bin/bash

dialog_title="Command Line Argument Test"
dialog_header="Arguments:"

args=(
   argument1
   argument2
   "argument with spaces"
   argumentN
)

osascript <<-SCRIPT
   if "$@" is "" then -- use args array
      set arg_list to "$(printf '%s\n' "${args[@]}")"
   else -- use cli arguments
      set arg_list to "$(printf '%s\n' "$@")"
   end if
   set arguments to ""
      repeat with anArg in paragraphs of arg_list
         set arguments to arguments & return & tab & anArg
      end repeat
   display dialog "$dialog_header" & arguments with title "$dialog_title"
SCRIPT

1voto

qarma Puntos 71

Red_menace dio una pista sobre el envío de argumentos de línea de comandos en osascript para ser recibido por el AppleScript run pero dado que no mostró cómo se haría esto, pensé que podría ser útil demostrar este método, especialmente porque es de lejos el más simple.

El comienzo del script va a parecer idéntico al de red_menace, y de hecho producen resultados idénticos. Pero la diferencia clave es donde la llamada a osascript está hecho:

#!/usr/bin/env bash

dialog_title="Command Line Argument Test"
dialog_header="Arguments:"

args=(arg1 arg2 "argument the third (avec une espace)" argN)

osascript - "${@:-${args[@]}}"  <<OSA
    prop text item delimiters : "\n\t"
    on run args
        display dialog {"$dialog_header", args} as text with title "$dialog_title"
    end
OSA

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