45

Shebangs を使用して Perl スクリプトを直接実行するのが好きです。

#!/usr/bin/env perl

Go プログラムのシバンとは何ですか?

4

9 に答える 9

37

私はこれを好みます:

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

これには、 の回答と比較していくつかの利点があります。

  • は、Go とシェルの構文を同時に有効にするという///usr/bin/true偉業を達成します。Go ではコメントです。シェルでは、ノーオペレーション コマンドです。

  • exec孫プロセスを起動する代わりに、新しいシェル プロセスを置き換えるために使用します。その結果、Go プログラムは直接の子プロセスになります。これはより効率的であり、デバッグや監視などの高度な状況でも重要です。

  • 引数の適切な引用。スペースや特殊文字は問題になりません。

  • 主要な///ものは、単なる よりも標準に準拠してい//ます。のみを使用する//と、実装定義の動作に遭遇するリスクがあります。http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.htmlからの引用は次のとおりです。

パス名が 2 つの連続した文字で始まる場合/、先頭の文字に続く最初のコンポーネント/は実装定義の方法で解釈される場合がありますが、3 つ以上の先頭の /文字は単一の文字として扱われ/ます。

この回答を bash、dash、zsh、および ksh でテストしました。

例:

///usr/bin/true; exec /usr/bin/env go run "$0" "$@"
package main
import "fmt"
func main() {
    fmt.Println("你好!")
}
于 2015-05-06T16:49:00.480 に答える
16

デフォルトではありません。ただし、gorunと呼ばれるサードパーティのツールがあります。https://wiki.ubuntu.com/gorun

残念ながら、コンパイラはシバンラインが好きではありません。gorunで実行するのと同じコードをコンパイルすることはできません。

于 2011-10-09T23:37:03.457 に答える
9

Go プログラムはバイナリにコンパイルされます。ソースから直接実行するオプションはないと思います。

これは、C++ や Java などの他のコンパイル済み言語に似ています。一部の言語 (Haskell など) は、完全にコンパイルされたモードと、シバン行を使用してソースから直接実行できる「スクリプト」モードの両方を提供します。

于 2011-10-09T23:08:40.430 に答える