Shebangは `//`で始まりますか?

Shebangは `//`で始まりますか?

次のスクリプト()が混乱しています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スクリプトであるファイルを構築するためです。

おすすめ記事