次のスクリプト()が混乱していますhello.go
。
//usr/bin/env go run $0 $@ ; exit
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
実行する準備ができました。 (MacOS X 10.9.5)
$ chmod +x hello.go
$ ./hello.go
hello, world
で始まるシャーバンについて聞いたことがありません//
。スクリプトの上部に空白行を挿入しても機能します。このスクリプトが機能するのはなぜですか?
ベストアンサー1
それはshebangではなく、単にデフォルトのシェルで実行されるスクリプトです。シェルは最初の行を実行します
//usr/bin/env go run $0 $@ ; exit
これはgo
ファイル名で呼び出しを行い、結果としてファイルがgoスクリプトとして実行され、ファイルの残りの部分を見ずにシェルが終了します。
//
しかし、なぜ正当な、または/
適切なshebangで始まるのですか#!
?
これは、ファイルが有効なgoスクリプトである必要があるためです。それ以外の場合は、goでエラーが発生します。 Goでは、これらの文字は//
コメントを表しているため、goは最初の行をコメントとして扱い、それを解釈しようとしません。ただし、この文字は#
コメントを表していないため、通常のshebangではgoがファイルを解釈するとエラーが発生します。
この構文を使用する理由は、単に踏むことなくシェルスクリプトとgoスクリプトであるファイルを構築するためです。