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 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:
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.
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.
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?
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:
cd
; Os users terão pastas e espaços estranhos em seus paths. cd
pode crashr; encerre seu AppleScript em um bloco de tentativa paira pegair alguns erros e avisair o user. 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.
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 .
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:
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 …"
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