*.appをopenするコマンドの作成

Macで*.appのアプリケーションをターミナルから開きたい。
しかし、

$ open -a /Applications/Safari.app hoge.html

とかいちいち打ち込むのもめんどくさい。
なんでシェルスクリプトを書いて、

$ safari hoge.html

で、開けるようにした。

#! /bin/sh

App="/Applications/Safari.app"

open -a "${App}" "$@"

しかし、*.appのアプリケーションはいっぱいあるので、
いちいちこのスクリプトを手で書いていくのはめんどくさい。
なので、上記のコードを生成するスクリプトを書いた。
アプリケーションの絶対パスを引数として、
フォルダ$HOME/binに上記の様なシェルスクリプトを生成する。
生成されるファイル名は、bオプションで指定が無い限り、
"Application APP.app"を引数としたら、
"application_app"の様に、
".app"を省略し、スペースをアンダーバーに、大文字を小文字に変換したものにしている。

#! /bin/sh

## コマンド名 make_app_bin

## コマンドを生成する標準のフォルダ名
folderName="${HOME}""/bin"

binName=""

## bオプションは、生成するシェルスクリプトのファイル名を指定する。
## fオプションは、生成するシェルスクリプトを格納するフォルダ名を指定する。
while getopts 'b:f:' OPTION
do
    case $OPTION in 
	b) binName="$OPTARG"
	    ;;
	f) folderName="$OPTARG"
	    ;;
	?) echo "Usage: "`basename "$0"`"[-b binName] [-f folderName] appName"
	    exit 2
	    ;;
    esac
done

## オプション部分を切り捨てる。
shift `expr $OPTIND - 1`

if [ "$#" -ne 1 ];
then
    echo "Usage: "`basename "$0"`"[-b binName] [-f folderName] appName"
    exit 2
fi

## bオプションが指定されていなかったら、
## ".app"を省略し、スペースをアンダーバーに、大文字を小文字に変換したものをコマンド名にする。
if [ -z "${binName}" ];
then
    binName=`basename "$1" | sed -e s/".app"/""/g | tr " " "_" | tr A-Z a-z`
fi

bin="${folderName}""/""${binName}"

## ファイルかシンボリックリンクがあったらスルーする。
if ([ -e "${bin}" ] || [ -L "${bin}" ]);
then
   echo "Warnings: "`basename "$0"`": ""${bin}"": file exists"
else
## コマンド生成。
    echo make: \""${binName}"\" -\> \"$1\"
    echo \#\! /bin/sh > ${bin}
    echo >> ${bin}
    echo App=\"$1\" >> ${bin}
    echo >> ${bin}
    echo open -a \"\$\{App\}\" \"\$@\" >> ${bin}
    chmod 755 ${bin}
fi

と、ここまで書けたので、後はApplicationsフォルダより下の階層から*.appを探してきて、
自動でコマンドを生成してくれれば完成である。
その為に以下のコマンドを実行。

$ find /Applications -name "*.app" -print0 |xargs -0 -I{} make_app_bin "{}"

これでターミナルから楽に*.appを開けるようになった。
満足。