/var/log/messages

Feb 22, 2018 - 1 minute read - Comments - Linux Go

Linux におけるスクリプト言語としての Go の使用

はてブから以下なエントリを見つけたのですが面白かったので確認エントリ投入してみます。

どうも .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 でスクリプト書く動機になるな。