*.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を開けるようになった。
満足。