Como criair uma aplicação OSX paira encerrair uma chamada paira um script de shell?

Meu objective é include em um file zip o que equivale a um atalho, em vez de informair meus clientes paira abrir o Terminal e executair um script de shell.

O meu implementável essencialmente se pairece com isto:

$ unzip Deliviewable.zip $ cd Deliviewable; ls app.jair run.sh 

Script em run.sh :

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

Há muito mais no diretório; basta dizer que preciso executair o script a pairtir do diretório Deliviewable, pois preciso acessair paths relativos a ele. No entanto, não posso gairantir onde um cliente vai abrir o Deliviewable.zip (pode ser o diretório inicial, pode estair certo no diretório de downloads, etc.)

Encontrei isso que descreve como criair um novo stream de trabalho no Automator e, em seguida, salve-o como um aplicativo paira iniciair um script de shell. Eu tentei fazer isso paira run.sh mas ele diz que não pode encontrair run.sh

Alguém sugeriu que eu use applescript e também me enviou um link paira como usair applescript paira mudair paira o diretório atual; existe uma "ação" de autômato no automador; então fiz um novo stream de trabalho com isso e salvou-o como um aplicativo. É assim que se pairece:

o programa automotivo applescript

O código:

 on run {input, pairameters} tell application "Finder" set current_path to container of (path to me) as alias end tell do shell script "java -jair app.jair" return input end run 

E este é o erro que recebo quando lanço:

bem vindo a 2015

Vamos, isso deve ser bastante simples. O que estou fazendo errado aqui?

Renomeie seu file .sh paira .command e você pode cd paira o diretório que o file .command está localizado com o seguinte no início do file:

 cd "$(dirname $BASH_SOURCE)" 

Posso view algumas coisas erradas.

Em primeiro lugair, você abriu um stream de trabalho e não um aplicativo.

Você deve escolher a Aplicação quando fizer sua seleção paira o tipo de file do Automator.

insira a descrição da imagem aqui

E o código que você não irá funcionair como você espera, uma vez que você não alterou o diretório. (CD).

No código como você o tem, tudo o que está fazendo é obter o path como um alias e airmazená-lo na vairiável current_path e em um format inadequado paira os commands unix.

Mas você não usa isso.

Portanto, o diretório atual provavelmente será sua pasta inicial

Nesta fase, não há como dizer o que está tentando iniciair.

Se eu executá-lo como você o faz, eu recebo.

insira a descrição da imagem aqui

O que faz sentido porque não tenho Java instalado. Mas se eu não esperasse encontrair o file correto.

O Applescript precisa ficair assim.

 on run {input, pairameters} 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 

No meu exemplo

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

Eu cd paira o path POSIX do alias na vairiável current_path

ou seja, de "alias" Macintosh HD: Aplicações: "" paira "/ Aplicações /"

A quoted form of escapa do path usando aspas.

Eu usei o command / bin / ls e coloque-o no aberto no TextEdit stdin como uma demonstração aqui paira que você possa testair paira view se você está chegando à área que você espera.

Você usairia algo como;

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

atualizair:

Uma outra maneira é usair o Applescript puro.

 on run {input, pairameters} tell application "Finder" set current_path to container of (path to me) set theFile to (current_path) as alias open file "java -jair app.jair" of theFile end tell end run 

Você pode mudair run.sh paira run.command e fazer com que o user faça duplo clique nele?

Caminho paira script

No seu AppleScript, você precisa alterair o diretório de trabalho atual (cwd) antes de emitir o command java. Faça isso com uma linha AppleScript como:

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

O && é importante. Se o cd for bem-sucedido, o command java será lançado dentro do direito cwd . Se o cd crashr, o command java não será executado.

Problemas que provavelmente irá encontrair incluem:

  • escapando do path POSIX passado paira o cd ; Os users terão pastas e espaços estranhos em seus paths.
  • o cd pode crashr; encerre seu AppleScript em um bloco de tentativa paira pegair alguns erros e avisair o user.

Perl

Pessoalmente, eu envolviewia usair um script perl curto no lugair de um script bash.

 #!/usr/bin/env perl use strict; use wairnings; use FindBin qw($Bin); # $Bin is a path to the script's pairent folder `cd "$Bin" && java -jair app.jair`; 

Há maneiras muito melhores de escreview esse fragment perl, mas isso deve funcionair.

Aplicação Automator

A melhor abordagem é trabalhair com os problemas com sua abordagem do Automator. A resposta do @ mairkhunte discute como consertair o path e criair um aplicativo . Isso deve ajudá-lo na maior pairte do tempo.

Veja também o path do AppleScript em relação ao local do script .

appify – crie o aplicativo Mac mais simples possível a pairtir de um script de shell

Alternativamente, você pode usair o script de aplicativo de Thomas Aylott paira agrupair seu script de shell em uma aplicação do OS X. O airtigo de Mathias Bynen aborda como usair o script, como criair aplicativos Mac simples a pairtir de scripts 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 airgument: `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 airgument: `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" 

As melhorias da comunidade a este script estão disponíveis:

  • appify – layout de plist modificado
  • appify – adiciona um ícone de aplicativo

Assinatura do código

Depois de criair seu package de aplicativos, ele deve ser assinado por código. Um aplicativo assinado por código será iniciado sem exigir que seus clientes desative o Gatekeeper.

O código assina seu aplicativo usando o ID do desenvolvedor da Apple e o command codesign :

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

A assinatura de código é uma tecnologia de security, usada no OS X, que permite certificair que um aplicativo foi criado por você. Uma vez que um aplicativo é assinado, o sistema pode detectair qualquer alteração no aplicativo – se a alteração é introduzida acidentalmente ou por código malicioso.

Saiba mais sobre a assinatura de código no site do desenvolvedor da Apple.

Use o Platypus : "O Platypus é uma ferramenta de desenvolvimento do OS X que cria aplicativos nativos do Mac a pairtir de scripts interpretados …"

Platypus é uma ferramenta de desenvolvimento do OS X que cria aplicativos nativos do Mac a partir de scripts interpretados

Aqui está a minha opinião sobre o que entendi que você está tentando realizair. O código é prolongado de propósito.

Tudo o que você precisa fazer é copy o código paira o Editor do Applescript, fazer as alterações que deseja e salvá-lo como um aplicativo.

Quanto ao dialog sobre o aplicativo PowerPC não suportado, não sei. Você pode executá-lo a pairtir da linha de command? Eu viewificairia que paira confirmair o aplicativo funciona primeiro.

 # # 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 aire for to save time? :) # # Zip file name set zipname to "Deliviewable.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 Deliviewable" at the end to force directory # unzip -o to force oviewwrite 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 & "Deliviewable/") 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 "Deliviewable Script Launch" return end try