USのAppleScript-Users MLで
「コマンドラインからパラメータ付きでAppleScriptを呼び出す方法ってないか?」
という質問が出ていた。これに対して、
「絶対にできない」
「CGIスタイルのAppleScriptなら、パラメータを渡せそうだが、やったことがない」
「シェル側で環境変数に設定してから、AppleScript側でそれをecho $VARIABLEで受け取ってみてはどうだ?」
と、的を外した解答ばかりだったので、「osasubrを使え」とコメント。
http://www.turbozen.com/mac/osasubr/
このフリーソフトを入れておくと、ファイル名を指定し、AppleScrip内のハンドラまで指定しつつパラメータの指定も可能である。
このosasubrの存在は覚えていたのだが、活躍する機会はほとんどなかった。MLへの投稿のために久しぶりに引っ張り出してきて……ついでにいろいろ実験しているうちに、便利な利用方法を思いついた。
Mac OS X標準のインストーラパッケージでは、インストールの前処理や後処理でスクリプトの実行が可能になっている。ところが、ここでいうスクリプトとはshell scriptやperlのスクリプト、あるいはバイナリであったりする。AppleScriptは使えないのだ。このあたりは、まだNeXT文化がそのまま残ったままだ。
ここで使えるじゃないか、osasubr。
インストーラパッケージにosasubrも一緒に入れて配布してしまい、インストール前に処理されるInstllationCheck、前処理スクリプトのpreflight、後処理スクリプトのpostflightなど、さまざまな処理スクリプトがあるが、これらをosasubrを使ってすべてAppleScriptで記述することが可能になるわけだ。それぞれのパラメータ取得のための最低限のshell scriptを書いておき、メインの処理についてはAppleScriptで書けばよい。
ただ、osasubrを試してみたところ……ちょっと困ったことも分かった。osasubrでAppleScriptを呼び出すと、これがDockに表示されてしまうのだ。これでは処理中にDockから強制終了することも可能になってしまう。
試しに、AppleScriptをバンドル形式でSave。Save後にInfo.plistを書き換えて、LSUIElementを"1"に設定してDockに出ることを抑止してみたのだが……バンドル形式のScriptはosasubrで実行できなかった。まあ、もともとアプリケーションではないのでLSUIElementを設定しても無意味なことには変わりないのだが……。
試しに、アプリケーションバンドルでSaveしたものをosasubrで呼び出してみたが、同様に実行できなかった。
インストーラの前処理で、Dockを隠す(終了させてもゾンビのように帰ってくるので逆効果)とよいだろうか。Dockの息の根を止めるための方策を調べておく必要がある(かなり難しいかも)。
それよりも、OS標準添付のInstaller.appでAppleScriptを実行できるようにしてくれ、とAppleにリクエストを出したほうが建設的か。