2011-10-09 65 views
26

我喜歡用shebangs直接運行我的Perl腳本:什麼是合適的去shebang線?

#!/usr/bin/env perl 

什麼是對圍棋程序的家當?

+4

圍棋編譯。你不應該需要一個shebang。對? –

+0

[golang-nuts的討論主題](https://groups.google.com/d/msg/golang-nuts/iGHWoUQFHjg/hEhYPQjP3HcJ)其中有一篇文章與[هومنجاویدپور]類似(http://stackoverflow.com/users/1040891)的[answer](http:// stackoverflow。com/a/17900932/109747) –

回答

9

Go程序被編譯爲二進制文件;我不認爲有一個選項可以直接從源代碼運行它們。

這與其他編譯語言(如C++或Java)類似。某些語言(如Haskell)提供了完全編譯模式和「腳本」模式,您可以使用shebang行直接從源代碼運行。

+0

+1 wheras Perl是一種解釋型腳本語言...... –

13

默認情況下沒有。雖然有一個名爲gorun的第三方工具可以讓你做到這一點。 https://wiki.ubuntu.com/gorun

不幸的是,編譯器不喜歡shebang線。你不能編譯你用gorun運行的相同代碼。

+0

Argh。 6g和朋友bork時,他們看到一個shebang。 – mcandre

+0

對不起,我應該提到這一點。編輯。 –

34

//usr/bin/go run $0 [email protected] ; exit

例如:

//usr/bin/go run $0 [email protected] ; exit 
package main 

import "fmt" 

func main() { 
    fmt.Println("Hello World!") 
} 

去對待//爲單行註釋 和外殼忽略附加/

+1

您可以編輯shebang以應用於任何Go文件,而不僅僅是hello_world.go?也許使用'$ 0'或者類似的東西? – mcandre

+6

這不是shebang線。它應該以'#!'開頭。 (知道去不喜歡它)。這是不可移植的,但對許多人來說可能已經足夠了,所以+1可以作爲答案。 – topskip

+2

我認爲最好這樣寫:'/// usr/bin/env運行$ 0 $ @;退出' – ivanzoid

11

我更喜歡這樣的:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 

這有與هوم的答案相比有幾個優點جاویدپور:

  • 用途「高管」,以取代推出孫子進程的新的shell進程來代替。因此,您的Go程序將是一個直接的子進程。這樣更高效,對於一些高級情況也很重要,例如調試和監視。

  • 適當引用參數。空格和特殊字符不會導致問題。

  • 領先的「///」比「//」更符合標準。如果您只使用「//」,則會冒着碰到實現定義的行爲的風險。下面是從http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html報價:

如果一個路徑名具有兩個連續的字符,所述第一 部件跟隨前字符可能在一個實現定義的方式來解釋 開始,雖然多於兩個主導 字符應被視爲單個字符。

我用bash,dash,zsh和ksh測試了這個答案。

例子:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 
package main 
import "fmt" 
func main() { 
    fmt.Println("你好!") 
} 
+1

我想指出的是,如果你的程序os.Exit()有一個非零的退出代碼,事實上是打印到stderr並去運行返回1作爲退出代碼。 – tmc

+0

這也是真實的答案從هومنجاویدپور –

+2

使用'/ bin/true'不是便攜式(例如OSX和Zsh) – Kreisquadratur