Skip to content

Goのコードをスクリプトとして実行する方法

完全にハックだと思うけれど、以下の記事に面白い方法が書いてあった。

Unixのshbangとして以下の行を挿入する。

//usr/local/bin/go run "$0" "$@"; exit
package main

実際のところ、これ自体はシバンではなくただのコマンド行として扱われる。

どういうことかというと、POSIXにおいては、元々のUNIXシェルがそうだったように

  • 行頭が #! である
  • 指示されたファイルが実行可能バイナリである

であればカーネルはそのコマンドを使うが、そうでなければ /bin/sh を使ってスクリプトファイルに記述されたコマンドを実行していく。なので上記のファイルを ./main.go -o output として実行した場合は /bin/sh に次のような行が渡される。

Terminal window
//usr/local/bin/go run main.go -o output; exit

ここで、main.go の1行目はシェルが解釈するためGoのソースコードとしてはコメントアウトされているのだが、POSIXではファイルパスの先頭に / がいくつあっても問題ないのでファイルパスとGoのコメントとしての記述が両立する。そして exit があるので、シェルからは2行目以降に書かれているGoのプログラムは全て無視されて、Goとしては2行目以降が実行されることになる。