Come creare un'applicazione OSX per avvolgere una chiamata in uno script di shell?

10

Il mio obiettivo è includere in un file zip ciò che equivale a una scorciatoia, invece di dire al mio cliente (i) di aprire Terminal ed eseguire uno script di shell.

Il mio spiegabile è essenzialmente il seguente:

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

Script in run.sh :

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

C'è molto di più nella directory; basti dire che ho bisogno di eseguire lo script dalla directory Deliverable poiché ho bisogno di accedere ai percorsi relativi ad esso. Tuttavia, non posso garantire dove un cliente aprirà Deliverable.zip (potrebbe essere la home directory, potrebbe essere proprio nella directory Download, ecc.)

Ho trovato questo che descrive come creare un nuovo flusso di lavoro in Automator, quindi salvarlo come un'applicazione per avviare uno script di shell. Ho provato a farlo per avvolgere run.sh ma dice che non riesce a trovare run.sh .

Qualcuno mi suggerì di usare il applescript e mi mandò anche un link su come usare applescript per passare alla directory corrente; c'è un "action" di applecript in automator; quindi ho creato un nuovo flusso di lavoro e l'ho salvato come applicazione. Ecco come appare:

Ilcodice:

onrun{input,parameters}tellapplication"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

E questo è l'errore che ottengo quando lo eseguo:

Andiamo, questo dovrebbe essere piuttosto semplice. Cosa sto facendo di sbagliato qui?

    
posta emptyset 13.08.2015 - 20:31
fonte

6 risposte

4

Rinomina il tuo file .sh in .command e puoi effettuare il cd nella directory in cui si trova il file .command con il seguente all'inizio del file:

cd "$(dirname $BASH_SOURCE)"
    
risposta data 22.08.2015 - 17:16
fonte
7

Posso vedere un paio di cose sbagliate lì.

In primo luogo hai aperto un flusso di lavoro e non un'applicazione.

Dovresti scegliere Applicazione quando effettui la selezione per il tipo di file Automator.

Eilcodicechehainonfunzioneràcomeprevisto,dalmomentochenonhaicambiatodirectory.(Cd).

Nelcodicecosìcom'è,tuttociòchestafacendoèottenereilpercorsocomealiasememorizzarlonellavariabilecurrent_patheinunformatononadattoaicomandiunix.

Manonlousi.

Quindiladirectorycorrentesaràmoltoprobabilmentelatuacartellahome

Inquestafasenonsisacosastiatentandodiavviare.

Seloeseguocosìcomesono.

IlchehasensodalmomentochenonhoinstallatoJava.Maselofacessi,nonmiaspettereichetroviilfilegiusto.

L'Applescriptdeveapparirecosì.

onrun{input,parameters}tellapplication"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 

Nel mio esempio

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

I cd al percorso POSIX dell'alias nella variabile current_path

da "alias" Macintosh HD: Applicazioni: "" a "/ Applicazioni /"

Il quoted form of esegue l'escape del percorso utilizzando le virgolette.

Ho usato il comando / bin / ls e lo collego al aperto in TextEdit stdin come dimostrazione qui in modo che tu possa testare per vedere se stai ricevendo nell'area che ti aspetti.

Useresti qualcosa del tipo;

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

Aggiornamento:

Un altro modo è usare semplicemente 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
    
risposta data 16.08.2015 - 03:32
fonte
5

Path to Script

Nel tuo AppleScript, devi modificare la directory di lavoro corrente (cwd) prima di emettere il comando java. Fai questo con una linea AppleScript come:

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

Il && è importante. Se il cd ha esito positivo, il comando java verrà avviato all'interno della parte destra cwd . Se cd fallisce, il comando java non verrà eseguito.

I problemi che probabilmente incontrerai includono:

  • escaping del percorso POSIX passato a cd ; gli utenti avranno cartelle e spazi con nomi diversi nei loro percorsi.
  • il cd potrebbe non riuscire; avvolgi il tuo AppleScript in un blocco prova per rilevare alcuni errori e avvisare l'utente.

perl

Personalmente, vorrei usare un breve script perl al posto di uno script 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';

Ci sono molti modi migliori per scrivere questo perl snippet, ma questo dovrebbe funzionare.

Applicazione di automazione

L'approccio migliore consiste nel risolvere i problemi con l'approccio di Automator. La risposta di @ markhunte illustra come risolvere il percorso e crea un'applicazione . Questo dovrebbe darti la maggior parte del modo.

Vedi anche percorso AppleScript relativo alla posizione dello script .

appify: crea l'app Mac più semplice possibile da uno script di shell

In alternativa, puoi utilizzare lo appify script di Thomas Aylott per raggruppare lo script della shell in un'applicazione OS X. L'articolo di Mathias Bynen illustra come utilizzare lo script, come creare semplici app Mac da script di 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"

I miglioramenti apportati dalla community a questo script sono disponibili:

Firma codice

Una volta creato il pacchetto di applicazioni, dovrebbe essere firmato con il codice. Un'app firmata con codice verrà avviata senza richiedere ai tuoi clienti di disabilitare Gatekeeper.

Codice firma la tua applicazione utilizzando il ID sviluppatore Apple e il comando codesign :

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

Code signing is a security technology, used in OS X, that allows you to certify that an app was created by you. Once an app is signed, the system can detect any change to the app—whether the change is introduced accidentally or by malicious code.

Leggi ulteriori informazioni sulla firma del codice sullo sviluppatore Apple sito.

    
risposta data 21.08.2015 - 12:11
fonte
4

Puoi cambiare run.sh in run.command e far fare doppio clic sull'utente?

    
risposta data 16.08.2015 - 00:11
fonte
3

Usa Platypus : "Platypus è uno strumento per sviluppatori OS X che crea applicazioni Mac native da script interpretati ..."

    
risposta data 30.07.2017 - 21:22
fonte
1

Ecco la mia opinione su ciò che ho capito che stai cercando di realizzare. Il codice è di lunga durata apposta.

Tutto ciò che devi fare è copiare il codice nell'editor di Applescript, apportare le modifiche desiderate e salvarlo come applicazione.

Per quanto riguarda la finestra di dialogo sull'applicazione PowerPC non supportata, non lo so. Puoi eseguirlo dalla riga di comando? Lo controllerei per confermare che l'app funzionasse per prima.

#
# 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
    
risposta data 19.08.2015 - 20:28
fonte

Leggi altre domande sui tag