« gitとgit-svnのコマンド | メイン | XMLHttpRequestでファイルをDataSchemeで取得する実験 »

Shell CommandをWrapしてappに変換するShell Commandを書いてみた

最近、FirefoxのBeta版を入れた。普段から、Firefoxは開発用のプロファイルを分けて使っているけど、Beta版用のプロファイルも作成した。例えば、Beta版用プロファイルの名前が「Firefox3.1 Beta3」だったとすると、Windowsでは、Firefoxのベータ版のショートカットを作成して「-no-remote -p "Firefox3.1 Beta3"」を追加しておくだけで良い。この方法を知ったのは数日前。TwitterとWassrに複数バージョン立ち上げる方法はないものかと言っていたらたくさんの人からレスを頂いた。名前出しの確認をとっていないのでここでは名前は出さない方向で。「-no-remote」と「-p」は常用してたけど、バージョンが違うと使えないと思い込んでいたけど、プロファイルはバージョンが違っても共用できるとのこと。しかし、MacではいちいちShellを起動して、
/Applications/Firefox\ Beta3.app/Contents/MacOS/firefox-bin -no-remote -p "Firefox3.1 Beta3"
としなくてはいけない。これが作業をする上で非常に面倒だった。GUIから起動したいと思って、TwitterやWassrでなんとかならないものかとまたぼやいていたら、elimさんからAppleScriptやAutomatorでShellを実行する方法があると教えて頂いた。
AppleScriptの例
AppleScriptの例
elimさんのgyazoより
AppleScriptの保存時のオプション
AppleScriptの保存時のオプション
elimさんのgyazoより
この方法、すっかり忘れてた。AppleScriptなんか随分前に使ってたのに...。どれくらい前かというと、AppleScriptが日本語でCodingできるくらい前から。AppleScriptは、WindowsでいうところのWSHみたいなもので、確かWSHよりも前からあったはず。各アプリケーションがAppleScript用に準備したAPIを使って色々な連携を可能とする結構優れた仕組み。AutomatorはAppleScriptのGUI版みたいなもので、プログラミングの知識がなくても、ワークフローをDrag&Dropで組み立てることができる。で、作ってみたは良いけど、起動が遅い。Shell Commandが遅いんじゃなく、AppleScriptやAutomatorの起動が遅すぎる。たかだかShell Commandを一行実行する為だけに、AppleScriptやAutomatorは重厚すぎた。しかも、Firefoxを実行している間はAppleScriptは立ち上がりっぱなしになるので、Dockには2つのアイコンが同時に増えてしまう。TwitterやWassrで気持ち悪いと言っていたら、またelimさんからレスが。
これって、yharaさんが去年言っていたやつだ。Binaryでなくても実行権限さえ持っていればShell Commandでも可能だということを思い出した。サンプルをダウンロードし、修正して作れば簡単なんだけど、勉強がてら自分でゼロから作成してみた。やってて気づいたのは、アイコン作成の部分以外の作成作業はShellとEmacsで簡単に可能だということ。これって、Emacsの作業はRedirectで可能だから全部Shellでも可能だ。アイコンの指定がなくてもappファイルの起動ができた。これはShell Command化ができるなぁと思ったので作ってみた。Shell Commandはほとんど知らないので次のリファレンスを参照しながら作成した。
前置き長くてごめんなさい。実装したのを貼ります。
make-command-wrapper
#!/bin/sh

if [ $# -ne 2 ] ; then
    echo "make-command-wrapper: This makes the application that wraps the shell command."
    echo "usage: make-command-wrapper [new application name] [shell command]"
    exit 1
fi

app_name="$1.app"
shell_command=$2

if [ -e "$app_name" ] ; then
    echo "The file of the same name or the folder already exists."
    exit 1
fi

mkdir $app_name
cd $app_name
mkdir Contents
cd Contents

cat <<__END_OF_MESSAGE__ >>Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>core.sh</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleSignature</key>
    <string>????</string>
  </dict>
</plist>
__END_OF_MESSAGE__

mkdir MacOS
cd MacOS

{
  echo "#!/bin/sh"
  echo ""
  echo "$shell_command &"
  echo "exit 0"
} >>core.sh

chmod 755 core.sh

exit 0
知っている人からすると例外処理が甘いだろうなとは思うけど、初めてのShell Command作成にしては上出来かなと。これを「make-command-wrapper」と言う名前で保存して実行権限を指定し、
./make-command-wrapper [新しいアプリケーション名] [実行するShell Command] 
とすると、Shell CommandをWrapしたappファイルが作成できる。これ結構便利かも。と、思ってたけど、当初の目的であるFirefoxのBeta版をプロファイル指定したものをapp化してみて愕然。
./make-command-wrapper firefoxbata3 /Applications/Firefox\\\ Beta3.app/Contents/MacOS/firefox-bin\ -no-remote\ -p\ \"Firefox3.1\ Beta3\"
Escapeが多くて非常にわかりにくい。使い物になるのかな、これ。
感想
古い知識とこの一年間で覚えたことが混じり合って変な気分。そしてTwitterやWassrがなければ無理だったと思う。しかし、ここ数年で開発のスタイルが大きく変わって、スピードが速くなったよなぁ。
関連リンク

トラックバック

このエントリーのトラックバックURL:
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/214

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google