@kyanny's blog

My thoughts, my life. Views/opinions are my own.

シェルスクリプトを .app 化して「システム環境設定 -> アカウント -> ログイン項目」に入れて OS 起動時に自動実行する

追記

launchd でも「起動時に実行」は実現できるそうです。コメントで教えてもらいました。あとはてブコメントより、 Automater でもできるっぽいです。

タイトルが長ったらしいのはあとで自分が忘れたときのために検索性を高める意図があります。

http://www.pqrs.org/tekezo/macosx/doc/makeapp/ に書いてある通りにした。というか、サンプルの zip ファイルをダウンロードして、そのまま起動スクリプトとアイコンだけ上書きしてリネームして使わせてもらった。

要するにこういうディレクトリツリーで必要なファイルを配置してやればいい。これで Finder からはアイコン一個のアプリケーションに見えて、「ログイン項目」に追加して起動させられる。

[kyanny@kyanny-laptop2 ~/Applications/LingrIRCGateway.app]
$ tree .
.
`-- Contents
    |-- Info.plist
    |-- MacOS
    |   `-- core.sh
    `-- Resources
        `-- icon.icns

3 directories, 3 files

最初はふつうにシェルスクリプトを起動項目に追加したんだけど、拡張子に関連づけられているアプリケーション(今回は Emacs.app だった)で開かれてしまい、うまくいかなかった。 .app 化しないとダメなのね。

core.sh の中身はこんなん。

$ cat Contents/MacOS/core.sh 
#!/bin/sh

/usr/local/bin/ruby $HOME/workdir/net-irc/examples/lig.rb --api_key=XXXX
exit 0

アイコンは Lingr Radar のを流用させてもらった(これも Finder からはアイコンだけにみえるけどシェルからみるとディレクトリなので Contents/Resources/applications.icon とかをコピーすればいい)。フィードっぽくてカッコイイ。

Info.plist はこんなん。

$ cat Contents/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>CFBundleIconFile</key>
    <string>icon.icns</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleSignature</key>
    <string>????</string>
  </dict>
</plist>