什么是合适的Go shebang系列?

mca*_*dre 38 shebang go

我喜欢使用shebangs直接运行我的Perl脚本:

#!/usr/bin/env perl
Run Code Online (Sandbox Code Playgroud)

Go程序的shebang是什么?

هوم*_*پور 41

//usr/bin/go run $0 $@ ; exit

例:

//usr/bin/go run $0 $@ ; exit
package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}
Run Code Online (Sandbox Code Playgroud)

去处理//作为单行注释和shell忽略额外/

  • 我正在使用的@ ivanzoid版本略有改进:`// usr/bin/env go run"$ 0""$ @"; 退出"$?"` (13认同)
  • 这不是一个shebang线.它应该以`#!`开头.(知道go不喜欢它).这是不可移植的,但对许多人来说可能已经足够好了,所以答案是+1. (7认同)
  • 您能否编辑shebang以适用于任何Go文件,而不仅仅是hello_world.go?也许使用`$0`之类的? (2认同)
  • 我认为最好这样写:`/// usr/bin/env go run $ 0 $ @; exit` (2认同)

lik*_*ike 22

我更喜欢这个:

///bin/true; exec /usr/bin/env go run "$0" "$@"
Run Code Online (Sandbox Code Playgroud)

与هومنجاویدپور的答案相比,这有几个优点:

  • 使用'exec'替换新的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" "$@"
package main
import "fmt"
func main() {
    fmt.Println("???")
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`/ bin/true`不是可移植的(例如OSX和Zsh) (3认同)
  • 我想指出的是,如果您的程序 os.Exit() 具有非零退出代码,则该事实会打印到 stderr 并且 go run 返回 1 作为其退出代码。 (2认同)
  • 我用`/// bin/true; TMPDIR ="$(cd"$(dirname"$ {0}")"&& pwd)"exec/usr/bin/go run"$ 0""$ @"`用于在/ tmp挂载时工作执行旗帜 (2认同)
  • @davejagoda —— `///usr/bin/true` 只是以 '//' 开头的一种方式,这是 Go 注释语法,同时仍然是有效的 shell 命令。“true”命令实际上什么也不做。真正的操作发生在“exec”中。我们不能直接从“exec”开始的原因是它是 shell 内置的,而不是普通的程序。 (2认同)
  • 这应该是公认的答案。 (2认同)
  • 怪癖: 1) 文件名必须有“.go”后缀 2) go fmt 通过在第二个和第三个斜杠之间插入空格来使这个 shebang 变形,迫使 shell 尝试打开不存在的“//”程序 (2认同)

Eva*_*haw 13

默认情况下没有一个.但是,有一个名为gorun的第三方工具可以让你这样做.https://wiki.ubuntu.com/gorun

不幸的是编译器不喜欢shebang系列.您无法编译与gorun一起运行的相同代码.


Gre*_*ill 8

Go程序被编译为二进制文件; 我认为没有选项可以直接从源代码运行它们.

这类似于其他编译语言,如C++或Java.某些语言(如Haskell)提供完全编译模式和"脚本"模式,您可以使用shebang行直接从源代码运行.