Як створити програму OSX, щоб завершити виклик до сценарію оболонки?


10

Моя мета - включити в zip-файл те, що становить ярлик, замість того, щоб сказати моєму клієнтові відкрити термінал і запустити скрипт оболонки.

Мій розгортаний по суті виглядає так:

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

Сценарій run.sh:

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

У довіднику набагато більше; достатньо сказати, що мені потрібно запустити скрипт із каталогу Deliverable, оскільки мені потрібно отримати доступ до шляхів відносно нього. Однак я не можу гарантувати, де клієнт відкриється Deliverable.zip(може бути домашній каталог, може бути прямо в каталозі завантажень тощо).

Я знайшов це, що описує, як створити новий робочий процес в Automator, а потім зберегти його як додаток для запуску скрипта оболонки. Я намагався зробити це, щоб завернути, run.shале він говорить, що не може знайти run.sh.

Хтось запропонував мені використовувати applescript, а також надіслав мені посилання про те, як використовувати яблучний сценарій для переходу в поточний каталог; є автоматизатор "дії" в яблуці; тому я створив новий робочий процес із цим і зберег його як додаток. Ось так виглядає:

програма автоматичного яблучного програмного забезпечення

Код:

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

І це помилка, яку я отримую, коли запускаю її:

ласкаво просимо до 2015 року

Скажімо, це має бути досить просто. Що я тут роблю неправильно?


Ну я щойно опублікував оновлення з більш простим яблучним сценарієм, але дивіться, мене побили до удару з відповіддю, яка повинна краще працювати для вас grgarside. :-)
markhunte

Назва цього питання не відповідає дійсному питанню, тому я проголосував. Питання є більш вузьким: мова йде про вирішення проблеми із повідомленням про помилку "Програми PowerPC більше не підтримуються", і це має бути в заголовку питання. Я фактично шукаю відповідь на те, як створити пакет програм. ОП знає, як створити пакет, але зіткнулася з помилкою.
Джейсон

Відповіді:


4

Перейменуйте свій .sh-файл у .command, і ви можете перейти до каталогу, в якому знаходиться .command-файл, із наступним на початку файлу:

cd "$(dirname $BASH_SOURCE)"

7

Я бачу пару речей там неправильно.

По-перше, ви відкрили робочий процес, а не Програму.

Вам слід вибрати програму, коли ви вибираєте тип файлу Automator.

введіть тут опис зображення

І код, який у вас є, не буде працювати так, як ви очікували, оскільки ви не змінили каталог. (cd).

У такому коді все, що він робить, - це отримати шлях як псевдонім і зберігати його у змінній current_path та у форматі, непридатному для команд unix.

Але ви цим не користуєтесь.

Тож поточний каталог, швидше за все, буде вашою домашньою папкою

На цьому етапі немає нічого сказати, що він намагається запустити.

Якщо я запускаю його так, як у вас є, я отримую.

введіть тут опис зображення

Що має сенс, оскільки у мене не встановлена ​​Java. Але якби я це зробив, я не сподівався, що він знайде потрібний файл.

Applescript повинен виглядати так.

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 

У моєму прикладі

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

Я переходжу на шлях POSIX псевдоніма в змінній current_path

тобто від "псевдоніма" Macintosh HD: програми: "" до "/ програми /"

quoted form of Збігає шлях , використовуючи лапки.

Я використав команду / bin / ls і передав її до відкритого в TextEdit stdin в якості демонстрації тут, щоб ви могли перевірити, чи потрапляєте ви в ту область, яку ви очікуєте.

Ви б використовували щось на зразок;

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

оновлення:

Інший спосіб - просто використовувати чистий 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

Це дуже близько до рішення; Я підтверджую, що ls | openкод безумовно відкриває потрібний мені каталог, що чудово. Але коли я дзвоню відкритим Client.app, я отримую: LSOpenURLsWithRole() failed with error -10665 for the file <path-to-Client.app> - кілька пошуків того, що означає ця помилка, пропонують видачу дозволу, я перевірив і встановлені +xпрапори. Я також спробував це , і це не вийшло (з тією ж помилкою).
порожній набір

Зауважте, що відкриття Client.appз Finder (подвійне клацання) також призводить до того ж спливаючого вікна помилки PowerPC.
порожній набір

@emptyset I call open Client.appЦе програма Automator З того, що я розумію в Automator у вас є AppleScript код do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\"". То де ти використовуєш openкоманду? наскільки я розумію, що ти робиш, не потрібно цим користуватися. Клієнти будуть користуватися подвійним клацанням на програму, і програма запустить java
markhunte

Я перевірив це обома способами: з командного рядка: $ open Client.appі подвійним клацанням. Ваша версія з викликом ls | open -feпрацює, але коли я її змінюю, java -jar app.jarвона дає мені цю помилку.
порожній набір

@emptyset trydo shell script "cd " & quoted form of (POSIX path of current_path) & " ; " & quoted form of "java -jar app.jar"
markhunte

6

Шлях до сценарію

У вашому AppleScript вам потрібно змінити поточний робочий каталог (cwd) перед тим, як видавати команду java. Зробіть це за допомогою рядка AppleScript, наприклад:

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

Важливе &&значення. Якщо це cdвдасться, javaкоманда буде запущена в межах правого cwd . Якщо cdне вдасться, javaкоманда не буде виконуватися.

Проблеми, які ви, швидше за все, матимете, включають:

  • уникнення шляху POSIX, переданого до cd; Користувачі матимуть на своїх контурах папки та пробіли з дивним ім’ям.
  • cdможе потерпіти невдачу; заверніть ваш AppleScript у блок спробу, щоб виявити деякі помилки та попередити користувача.

перл

Особисто я хотів би використати короткий сценарій perl замість 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`;

Є набагато кращі способи написання цього фрагмента perl, але це має працювати.

Додаток Автоматизатор

Найкращий підхід - це вирішити проблеми з підходом до автоматизації. Відповідь @ markhunte розповідає про те, як виправити шлях та створити додаток . Це має отримати вам більшу частину шляху.

Також дивіться шлях AppleScript щодо місця розташування сценарію .

appify - створити найпростіший можливий додаток Mac із сценарію оболонки

Крім того, ви можете використовувати скрипт appify Томаса Ейлотта для поєднання сценарію оболонки в додаток OS X. У статті Матіаса Байнена описано, як використовувати сценарій, як створити прості програми Mac із скриптів оболонки .

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

Досягнуті вдосконалення цього сценарію спільноти доступні:

Підписання коду

Після створення пакету додатків його слід підписати кодом. Додаток, що підписується кодом, запуститься, не вимагаючи від ваших клієнтів відключати функцію Gatekeeper.

Код підпишіть свою програму за допомогою свого ідентифікатора розробника Apple та codesignкоманди:

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

Підписання коду - це технологія безпеки, яка використовується в OS X, яка дозволяє підтвердити, що додаток створено вами. Після підписання програми система може виявити будь-які зміни в додатку - чи внесені зміни випадково чи за допомогою шкідливого коду.

Докладніше про підписання коду на сайті розробника Apple.


Дякуємо за пораду щодо підписання коду; Я зараз переглядаю це і тестую сценарій appify!
порожній набір

appify скрипт не працював; той же випуск шляху
порожній набір

@emptyset Я додав розділ шлях і Perl. Можливо, варто також розділити проблему шляху на нове питання. Якщо ви можете це виправити, ви можете скористатися Automator або сценарієм appify.
Грем Мілн


4

Ви можете змінити , run.shщоб run.commandі отримати користувач двічі клацнувши?


Це майже спрацювало! Однак він запустив файл із контексту домашнього каталогу користувача ( cd ~), що спричинило його збій.
порожній набір

1
@emptyset Використовуйте $ BASH_SOURCE, див. apple.stackexchange.com/a/201482
grg

1

Ось мій погляд на те, що я зрозумів, що ви намагаєтеся досягти. Код заздалегідь намотаний спеціально.

Все, що вам потрібно зробити, - скопіювати код в редактор Applescript, внести всі необхідні зміни та зберегти його як додаток.

Щодо діалогу про програму PowerPC не підтримується, я не знаю. Чи можете ви запустити його з командного рядка? Я б перевірив, що для підтвердження роботи програми спочатку працює.

#
# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.