Shell

Shebang 以 // 開頭?

  • February 6, 2018

我對以下腳本(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 腳本的文件,而沒有一個踩另一個。

引用自:https://unix.stackexchange.com/questions/162531