uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

Mac OS Xでgroovyスクリプトをshebangで実行

JGGUG MLでのやりとりより。

UNIX系OSでは、一般に、shebang(シバン・シェバン)すなわち、実行権のついたファイルの最初の行が#!で始まっているとき、それをシェルスクリプト(もしくはインタープリタ言語のソースコード)とみなして、シェルからコマンドとして実行できる、という機能が(システムコールレベルで)あるのですが、groovyについてもLinuxでは可能なのですが、Mac OS Xでは「#!/usr/local/bin/groovy」では動かないねーという話がありました。(関西支部でのGinA読書会のときの話題から)

この原因はMac OS Xshebangを処理する際に、#!行でインタープリタとして指定されたコマンドが、バイナリか、シェルスクリプトを判別し、シェルスクリプトだった場合実行してくれない(sh/bashに渡す)、という仕様によると思われます。

ご存知の様にgroovyの起動コマンドはシェルスクリプト(Windows環境下ではバッチファイル)だからです。

この回避方法として、すなわちMac OS Xshebangをもちいてgroovyスクリプトを直接実行する方法の一つとして、#!/usr/bin/env groovy見たいにやる方法と、あと以下のようにJVM起動コマンドを直接指定する方法があります。envを介在させるとgroovy自体に対する引数が渡せないという問題があるので、有効なケースがあるかもしれません(ないかもしれません)。

#!/Library/Java/Home/bin/java -classpath
/tool/groovy-1.6.2/target/install/lib/groovy-1.6.2.jar
-Dgroovy.starter.conf=/tool/groovy-1.6.2/target/install/conf/groovy-starter.conf
-Dgroovy.home=/tool/groovy-1.6.2/target/install
-Dtools.jar=/Library/Java/Home/lib/tools.jar
org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain
--conf /tool/groovy-1.6.2/target/install/conf/groovy-starter.conf
--classpath .

println "hello"

あ、GROOVY_HOME等に相当するパスは適宜書き換える必要があります。

宇宙刑事シャリバン Vol.1 [DVD]

宇宙刑事シャリバン Vol.1 [DVD]


機動刑事ジバン Vol.1 [DVD]

機動刑事ジバン Vol.1 [DVD]