11 votes

Comment créer une application OSX pour envelopper un appel à un shell script ?

Mon objectif est d'inclure dans un fichier zip ce qui revient à un raccourci, au lieu de dire à mon ou mes clients d'ouvrir Terminal et d'exécuter un script.

Mon déployable ressemble essentiellement à ceci :

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

script en run.sh :

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

Il y a beaucoup plus dans le répertoire ; il suffit de dire que je dois exécuter le script à partir du répertoire Livrable puisque j'ai besoin d'accéder à des chemins relatifs à celui-ci. Cependant, je ne peux pas garantir l'endroit où un client va ouvrir Deliverable.zip (il peut s'agir du répertoire personnel, du répertoire des téléchargements, etc.)

J'ai trouvé ce qui décrit comment créer un nouveau flux de travail dans Automator, puis l'enregistrer comme une application pour lancer un script. J'ai essayé de faire ça pour envelopper run.sh mais il dit qu'il ne peut pas trouver run.sh .

Quelqu'un m'a suggéré d'utiliser applescript et m'a également envoyé un lien sur la façon d'utiliser applescript pour passer dans le répertoire courant ; il y a une "action" applescript dans automator ; j'ai donc créé un nouveau flux de travail avec cela, et je l'ai enregistré comme application. Voici à quoi cela ressemble :

the automator applescript program

Le code :

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

Et voici l'erreur que j'obtiens lorsque je l'exécute :

welcome to 2015

Allez, ça devrait être assez simple. Qu'est-ce que je fais de mal ici ?

7voto

markhunte Points 11634

Je vois plusieurs choses qui ne vont pas.

Tout d'abord, vous avez ouvert un flux de travail et non une application.

Vous devez choisir Application lorsque vous faites votre sélection pour le type de fichier Automator.

enter image description here

Et le code que vous avez ne fonctionnera pas comme prévu, puisque vous n'avez pas changé de répertoire. (cd).

Dans le code tel que vous l'avez, tout ce qu'il fait est de récupérer le chemin comme un alias et de le stocker dans la variable chemin actuel et dans un format inadapté aux commandes unix.

Mais vous ne l'utilisez pas.

Le répertoire courant sera donc probablement votre dossier personnel.

À ce stade, il est impossible de savoir ce qu'il tente de lancer.

Si je l'exécute comme vous l'avez fait, j'obtiens

enter image description here

Ce qui est logique puisque je n'ai pas installé Java. Mais si c'était le cas, je ne m'attendrais pas à ce qu'il trouve le bon fichier.

L'Applescript doit ressembler à ceci.

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 

Dans mon exemple

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

Je cd à la Chemin d'accès POSIX de l'alias dans la variable chemin actuel

c'est-à-dire de "alias "Macintosh HD:Applications :"" à "/Applications/"

En quoted form of échappe le chemin d'accès en utilisant des guillemets.

J'ai utilisé le /bin/ls et l'envoyer à la commande ouvrir dans TextEdit stdin comme une démonstration ici afin que vous puissiez tester pour voir si vous arrivez à la zone que vous attendez.

Vous utiliseriez quelque chose comme ;

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

mettre à jour :

Une autre solution consiste à utiliser le pur 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

6voto

Graham Miln Points 39606

Chemin vers script

Dans votre AppleScript, vous devez modifier l'attribut répertoire de travail actuel (cwd) avant de lancer la commande java. Faites-le avec une ligne AppleScript comme :

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

En && est important. Si le cd réussit, le java sera lancé dans le droit cwd . Si cd échoue, le java ne sera pas exécutée.

Les problèmes que vous rencontrerez probablement sont les suivants :

  • l'échappement du chemin POSIX passé à cd les utilisateurs auront des dossiers aux noms bizarres et des espaces dans leurs chemins.
  • le site cd peut échouer ; emballez votre AppleScript dans une balise essayez pour attraper certaines erreurs et avertir l'utilisateur.

perl

Personnellement, j'utiliserais un court script en perl au lieu d'un script en 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`;

Il y a de bien meilleures façons d'écrire ce snippet perl mais cela devrait fonctionner.

Application Automator

La meilleure approche consiste à résoudre les problèmes avec votre approche Automator. Réponse de @markhunte discute de la façon de réparer le chemin et créer une application . Cela devrait vous permettre de faire une bonne partie du chemin.

Voir aussi Chemin AppleScript relatif à l'emplacement de script. .

appify - créez l'application Mac la plus simple possible à partir d'un script de l'interpréteur de commandes.

Sinon, vous pouvez utiliser la méthode de Thomas Aylott appify script pour regrouper votre script dans une application OS X. L'article de Mathias Bynen explique comment utiliser le script, Comment créer des applications Mac simples à partir de scripts shell scripts. .

#!/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"

Des améliorations apportées par la communauté à ce script sont disponibles :

Signature du code

Une fois que vous avez créé votre paquet d'application, il debe être signé par un code. Une application signée par code sera lancée sans que vos clients aient à désactiver Gatekeeper.

Signer le code de votre application en utilisant votre ID du développeur Apple et le codesign commandement :

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

La signature de code est une technologie de sécurité, utilisée dans OS X, qui vous permet de certifier qu'une application a été créée par vous. Une fois qu'une application est signée, le système peut détecter toute modification apportée à l'application, que cette modification soit introduite accidentellement ou par un code malveillant.

Apprendre en savoir plus sur la signature du code sur le site Apple Developer.

5voto

James Brock Points 1502

Utiliser l'ornithorynque : "Platypus est un outil de développement OS X qui crée des applications Mac natives à partir de scripts interprétés..."

Platypus is an OS X developer tool that creates native Mac applications from interpreted scripts

4voto

forquare Points 1427

Pouvez-vous changer run.sh à run.command et faire en sorte que l'utilisateur double-clique dessus ?

4voto

grg Points 181593

Renommez votre fichier .sh en .command et vous pouvez accéder au répertoire dans lequel se trouve le fichier .command avec ce qui suit au début du fichier :

cd "$(dirname $BASH_SOURCE)"

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X