シェルスクリプトへの呼び出しをラップする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の使用を提案し、applescriptを使用して現在のディレクトリに切り替える方法へのリンクも送ってくれました。オートマトンにはアップルスクリプトの「アクション」があります。それで新しいワークフローを作成し、アプリケーションとして保存しました。これは次のようになります。

オートマタの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年へようこそ

おいおい、これはかなりシンプルなはずだ。ここで何が間違っているのですか?


さて、私はより単純なAppleScriptで更新を投稿したばかりですが、grgarsideがあなたのためにもっとうまくいくはずの答えでパンチに打ちのめされたのを見てください。:-)
markhunte 2015

この質問のタイトルは実際の質問を表すものではないため、反対票を投じました。質問の範囲は狭くなります。「PowerPCアプリケーションはサポートされなくなりました」というエラーメッセージの問題を解決することであり、これが質問のタイトルにあるはずです。アプリケーションバンドルを作成する方法に対する答えを実際に探しています。OPはバンドルの作成方法を認識していますが、エラーが発生しました。
Jason

回答:


4

.shファイルの名前を.commandに変更すると、.commandファイルが置かれているディレクトリにcdして、ファイルの先頭に次の行を追加できます。

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"

変数current_pathのエイリアスの POSIXパスにcdします

つまり、「エイリアス "Macintosh HD:Applications:"」から 「/ Applications /」へ

quoted form of 引用符を使用してパスをエスケープします。

ここでは、/ bin / lsコマンドを使用して、TextEdit stdinopenにそれをデモンストレーションとしてパイプし、期待した領域に到達しているかどうかをテストできるようにしています。

次のようなものを使用します。

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コードが確実に目的のディレクトリを開くことを確認しました。これはすばらしいことです。しかし、openを呼び出すとClient.app、次のLSOpenURLsWithRole() failed with error -10665 for the file <path-to-Client.app> エラーメッセージが表示されます。- このエラーが意味することを数回検索する、アクセス許可の問題が示唆され、チェックして+xフラグが設定されます。私もこれを試しましたが、うまくいきませんでした(同じエラーで)。
emptyset 2015

Client.appFinderから開く(ダブルクリック)と、同じPowerPCエラーポップアップが表示されることに注意してください。
emptyset 2015

@emptyset I call open Client.appこれは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 2015

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

6

スクリプトへのパス

AppleScriptでは、javaコマンドを発行する前に、現在の作業ディレクトリ(cwd)を変更する必要があります。次のような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をtryブロックで囲み、いくつかのエラーをキャッチしてユーザーに警告します。

perl

個人的には、bashスクリプトの代わりに短いperlスクリプトを使用します。

#!/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スニペットを書くにはもっと良い方法がありますが、これはうまくいくはずです。

Automatorアプリケーション

最良のアプローチは、Automatorアプローチの問題を解決することです。@markhunteの回答では、パスを修正してアプリケーション作成する方法について説明しています。これでほとんどの方法が得られます。

スクリプトの場所を基準にしたAppleScriptパスも参照してください。

appify —シェルスクリプトから可能な限りシンプルなMacアプリを作成します

または、Thomas Aylottのappifyスクリプトを使用して、シェルスクリプトをOS Xアプリケーションにバンドルすることもできます。Mathias Bynenの記事では、スクリプトの使用方法、シェルスクリプトから簡単な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"

このスクリプトのコミュニティによる改善が利用可能です:

コード署名

アプリケーションバンドルを作成したら、コード署名する必要があります。コード署名されたアプリは、クライアントがゲートキーパーを無効にすることなく起動します。

Apple Developer IDcodesignコマンドを使用して、アプリケーションにコード署名します。

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

コード署名は、OS Xで使用されるセキュリティ技術であり、アプリが自分で作成したことを証明できます。アプリが署名されると、システムはアプリへの変更を検出できます。変更が誤って導入されたか、悪意のあるコードによって導入されたかにかかわらずです。

コードサイニングについて詳しくは、Apple Developerサイトをご覧ください。


コード署名に関するヒントをありがとうございます。私は今それを調べて、appifyスクリプトをテストしています!
emptyset 2015

appifyスクリプトが機能しませんでした。同じパスの問題
emptyset

@emptysetパスとperlセクションを追加しました。パスの問題を新しい質問に分離することも価値があります。これを修正できる場合は、Automatorまたはappifyスクリプトを使用できます。
Graham Miln 2015


4

に変更run.shrun.commandて、ユーザーにダブルクリックしてもらえますか?


それはほとんどうまくいった!ただし、ユーザーのホームディレクトリ(cd ~)のコンテキストからファイルを実行したため、失敗しました。
emptyset 2015

1
@emptyset $ BASH_SOURCEを使用します。apple.stackexchange.com
a

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.