はてブから以下なエントリを見つけたのですが面白かったので確認エントリ投入してみます。
どうも .go というファイルをスクリプト的に動作させることができる gorun
というライブラリがあるらしく、それを取得して /usr/local/bin
配下に投入しています。
$ go get github.com/erning/gorun
$ sudo mv ~/go/bin/gorun /usr/local/bin/
これで例えば以下なソレを
package main
import (
"fmt"
"os"
)
func main() {
s := "world"
if len(os.Args) > 1 {
s = os.Args[1]
}
fmt.Printf("Hello, %v!", s)
fmt.Println("")
if s == "fail" {
os.Exit(30)
}
}
以下な形で実行できると。
$ gorun helloscript.go
Hello, world!
$ echo $?
0
$ gorun helloscript.go gopher
Hello, gopher!
$ echo $?
0
$ gorun helloscript.go fail
Hello, fail!
$ echo $?
30
で、さらに .go なスクリプトの名前だけで何とかならないか、ということで binfmt_misc という kernel な機能?が使えるようです。ドキュメントは以下から参照可能。
上記によれば
:golang:E::go::/usr/local/bin/gorun:OC
という文字列を書き込んで差し上げれば良い模様。意味合いとしては
.go
という拡張子の実行可能ファイルに encounter したら/usr/local/bin/gorun
というインタプリタで実行してください- `OC` フラグは
the script will be executed according to the owner information and permission bits set on the script itself, and not the ones set on the interpreter binary
を指定しているのかどうか
この指定を入れて実機で確認してみます。
$ echo ':golang:E::go::/usr/local/bin/gorun:OC' | sudo tee /proc/sys/fs/binfmt_misc/register
:golang:E::go::/usr/local/bin/gorun:OC
どうなるか。
結果
実行できました。
$ ./helloscript.go
Hello, world!
これは golang
でスクリプト書く動機になるな。