2013年2月9日土曜日

シェルスクリプトをMacのアプリケーション化するシェルスクリプト

何だかヘンテコなタイトルですみません。
以前、Automatorでシェルスクリプトを実行する記事を書きました。それなりに便利に使っていたのですが、起動時間をもう少し早くできないかと考えました。
実行したい部分はシェルスクリプトなので、Automatorが起動する部分を省略できれば起動時間も短縮できるのではと考えて、以下のようなシェルスクリプトを作りました。
そんなに長くないので全部載せます。

記載しているシェルスクリプトを、mkshellapp.shとして保存します。実行権も忘れないで付けてPATHの通った場所に置いてください。使い方は、
$ mkshellapp.sh シェルスクリプトファイル
です。
引数のシェルスクリプトは、アプリケーション化したいシェルスクリプトファイルのパスです。拡張子に.shを付けている場合は、それを除いた部分、つまりファイル名の本体部分を生成されるアプリケーション名にします。
アイコンはデフォルトのアプリケーションアイコンになります。気になる人は、カスタムアイコンを付けてください。

mkshellapp.shのソース


#!/bin/sh
# mkshellapp.sh - make application from shell_script
PROG=`basename $0`
USAGE="Usage: $PROG shell_script"

case $# in
1)  scr="$1" ;;
*)  echo $USAGE >&2
    exit 2 ;;
esac

app_name=`basename "$scr" .sh`.app

mkdir -p "$app_name"/Contents/MacOS

if [ -x "$scr" ]; then
    cp -p "$scr" "$app_name"/Contents/MacOS
else
    echo "Error: $PROG: $scr is not found or not executable." 2>&1
    exit 1
fi

cat << EOF > "$app_name"/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>`basename "$scr"`</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleSignature</key>
    <string>????</string>
  </dict>
</plist>
EOF

echo "$PROG: $app_name successfully created."

ところで、このスクリプトには人によっては欠点があります。
それは、アプリケーション(内部のシェルスクリプト)に渡す引数を、例えばドラッグアンドドロップなどで渡せないことです。ちょっと調べたのですが、わかりませんでした。
ということで、引数が固定的な場合だけ上記のスクリプトを使っています。

1 件のコメント:

  1. これは便利でした。ありがとうございます。

    返信削除