Какова подходящая линия Go Shebang? - PullRequest
34 голосов
/ 10 октября 2011

Мне нравится использовать shebangs для непосредственного запуска моих сценариев Perl:

#!/usr/bin/env perl

Что такое shebang для программ Go?

Ответы [ 4 ]

37 голосов
/ 27 июля 2013

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

пример:

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

import "fmt"

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

go рассматривать // как однострочный комментарий и оболочка игнорирует лишние /

18 голосов
/ 06 мая 2015

Я предпочитаю это:

///bin/true; exec /usr/bin/env go run "$0" "$@"

Это имеет несколько преимуществ по сравнению с ответом на вопрос:

  • Использование exec для замены нового процесса оболочкивместо запуска процесса внука.В результате ваша программа 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("你好!")
}
13 голосов
/ 10 октября 2011

По умолчанию нет ни одного.Есть сторонний инструмент под названием gorun, который позволит вам это сделать.https://wiki.ubuntu.com/gorun

К сожалению, компиляторам не нравится строка shebang.Вы не можете скомпилировать тот же код, который вы запускаете с помощью gorun.

9 голосов
/ 10 октября 2011

Программы Go скомпилированы в двоичные файлы; Я не думаю, что есть возможность запускать их напрямую из источника.

Это похоже на другие скомпилированные языки, такие как C ++ или Java. Некоторые языки (например, Haskell) предлагают как полностью скомпилированный режим, так и режим «сценариев», который вы можете запускать непосредственно из источника с помощью строки shebang.

...