ShellShebang 以
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
我還沒有聽說過 shebang 從
//
. 當我在腳本頂部插入一個空行時它仍然有效。為什麼這個腳本有效?
它不是一個 shebang,它只是一個由預設 shell 執行的腳本。shell 執行第一行
//usr/bin/env go run $0 $@ ; exit
這會導致
go
使用此文件的名稱進行呼叫,因此結果是此文件作為 go 腳本執行,然後 shell 退出而不查看文件的其餘部分。但是為什麼要從而
//
不是僅僅/
或適當的 shebang開始#!
呢?這是因為文件必須是有效的 go 腳本,否則 go 會報錯。在 go 中,字元
//
表示註釋,因此 go 將第一行視為註釋並且不會嘗試解釋它。然而,該字元#
並不表示註釋,因此當 go 解釋文件時,正常的 shebang 會導致錯誤。語法的這個原因只是為了建構一個既是 shell 腳本又是 go 腳本的文件,而沒有一個踩另一個。