2011-10-09 25 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