シェルスクリプトをドラッグアンドドロップ対応のアプリケーションにする

  • 26
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

シェルスクリプトを実行するアプリケーションの作成を書いたのでドラッグアンドドロップ対応版も書いておきます。

AppleScript のテンプレ

/path/to/program の部分を実行したいプログラムのパスに書き換えればそのまま動作すると思います。

ドロップレット対応にする場合は open ハンドラを使用します。アプリケーションを直接起動した場合は引数が無いため choose file でファイル選択ダイアログを表示します。引数が必要なければ main({}) で空にできます。

アプリケーションバンドル内に別のシェルスクリプトを配置して実行する方法は過去の投稿に書いてあります。

※この AppleScript は入力ファイルを順番に処理するため複数ファイルを同時に開くことはできません。

on main(input)
    try
        do shell script "/path/to/program" & space & input
    end try
end main

on open argv
    repeat with aFile in argv
        main(quoted form of POSIX path of aFile)
    end repeat
end open

on run
    -- ファイル選択を行う場合
    main(quoted form of POSIX path of (choose file))
    -- 引数をつけない場合
    -- main({})
end run

アプリケーション作成スクリプトの例

ffplay 実行する OS X アプリケーションを作成して拡張子関連付けまでを行う例です。

bundle=FFPlay.app

# アプリケーションの作成
osacompile -o "${bundle}" <<__APPLESCRIPT__
on main(input)
    try
        do shell script "/usr/local/bin/ffplay -i" & space & input
    end try
end main

on open argv
    repeat with aFile in argv
        main(quoted form of POSIX path of aFile)
    end repeat
end open

on run
    main(quoted form of POSIX path of (choose file))
end run
__APPLESCRIPT__

# 拡張子関連付けの追加
while read
do
    /usr/libexec/PlistBuddy -c "${REPLY}" "${bundle}"/Contents/Info.plist
done <<__EOS__
Add :CFBundleDocumentTypes:1:CFBundleTypeExtensions array
Add :CFBundleDocumentTypes:1:CFBundleTypeExtensions:0 string mp4
Add :CFBundleDocumentTypes:1:CFBundleTypeExtensions:1 string m4v
Add :CFBundleDocumentTypes:1:CFBundleTypeMIMETypes string video/mp4
Add :CFBundleDocumentTypes:1:CFBundleTypeName string MPEG-4 content
Add :CFBundleDocumentTypes:1:CFBundleTypeRole string Viewer
__EOS__

osacompile で作成したアプリケーションは全ての拡張子に対応するように Info.plist が作成されますが、この状態では Finder のコンテキストメニューの「このアプリケーションで開く」に表示されないため拡張子ごとに CFBundleDocumentTypes を追加してあげる必要があります。

defaults write でも array や dictionary は書き込めますが CFBundleDocumentTypes のように入れ子になっていたり複雑なものは /usr/libexec/PlistBuddy が便利です(Property List Editor/Xcode や XML 対応のテキストエディタなどで書き換えてもOK)。

アプリケーション作成用関数の例

AppBundler_ ()
{
    if ! [ $# -ge 2 -a -x "$2" ]
    then
        echo "Invalid argment or executable."
        return 1
    fi
    local n="$1"
    shift
    osacompile -o "${n}".app <<__APPLESCRIPT__
on main(input)
    do shell script "$*" & space & input
end main

on open argv
    repeat with aFile in argv
        main(quoted form of POSIX path of aFile)
    end repeat
end open

on run
    main(quoted form of POSIX path of (choose file))
end run
__APPLESCRIPT__
}

第一引数にアプリケーション名、第二引数以降に実行したいプログラムのパスや引数をつけて実行すればカレントディレクトリにアプリケーションを作成します。

AppBundler_ FFPlay /usr/local/bin/ffplay -i