2011-10-09 12 views
26

Mi piace usare SheBangs per eseguire direttamente i miei script Perl:Qual è la linea Go Shebang appropriata?

#!/usr/bin/env perl 

Qual è la baracca per i programmi Go?

+4

Go viene compilato. Non dovresti aver bisogno di una shebang. Destra? –

+0

[Discussion thread in golang-nuts] (https://groups.google.com/d/msg/golang-nuts/iGHWoUQFHjg/hEhYPQjP3HcJ) che hanno un post simile a [هومن جاویدپور] (http://stackoverflow.com)/users/1040891) 's [risposta] (http: // stackoverflow.it/a/17900932/109747) –

risposta

9

I programmi di go vengono compilati in binari; Non penso che ci sia un'opzione per eseguirli direttamente dalla fonte.

Questo è simile ad altri linguaggi compilati come C++ o Java. Alcune lingue (come Haskell) offrono sia una modalità completamente compilata che una modalità "script" che puoi eseguire direttamente dal sorgente con una riga shebang.

+0

+1 dove Perl è un linguaggio di scripting interpretato .... –

13

Non ce n'è uno di default. C'è uno strumento di terze parti chiamato gorun che ti permetterà di farlo, però. https://wiki.ubuntu.com/gorun

Sfortunatamente ai compilatori non piace la linea shebang. Non puoi compilare lo stesso codice che usi con gorun.

+0

Argh. 6g e gli amici borkano quando vedono una shebang. – mcandre

+0

Scusa, avrei dovuto dirlo. Modificato. –

34

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

esempio:

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

import "fmt" 

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

go trattare // come una singola riga di commento e Shell ignorano extra/

+1

Potresti modificare lo shebang per applicarlo a qualsiasi file Go, non solo hello_world.go? Forse usare '$ 0' o simile? – mcandre

+6

Questa non è una linea di shebang. Dovrebbe iniziare con '#!'. (Sapendo che andare non piace). Questo non è portabile, ma forse è abbastanza buono per molte persone, quindi +1 per la risposta. – topskip

+2

Penso che sia meglio scrivere così: '/// usr/bin/env go run $ 0 $ @; exit' – ivanzoid

11

preferisco questo:

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

Questo ha diversi vantaggi rispetto alla risposta di هوم جاویدپور:

  • usi 'exec' per sostituire il nuovo processo shell invece di lanciare un processo nipotino. Di conseguenza, il tuo programma Go sarà un processo figlio diretto. Questo è più efficiente ed è anche importante per alcune situazioni avanzate, come il debug e il monitoraggio.

  • Quotazione corretta degli argomenti. Spazi e caratteri speciali non causeranno problemi.

  • Il principale "///" è più conforme agli standard di appena "//". Se si utilizza solo "//", si rischia di imbattersi in comportamenti definiti dall'implementazione. Ecco una citazione da http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html:

Se un percorso inizia con due caratteri successivi, il primo componente seguente protagonisti può essere interpretata in modo definito dall'implementazione, anche se più di due principali caratteri devono essere trattati come un singolo carattere.

Ho provato questa risposta con bash, dash, zsh e ksh.

Esempio:

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

Voglio sottolineare che se il tuo programma os.Exit() s con un codice di uscita diverso da zero che sta stampando su stderr e go esegue restituisce 1 come codice di uscita. – tmc

+0

Questo vale anche per la risposta di هومن جاویدپور –

+2

L'uso di '/ bin/true' non è così trasferibile (ad es. OSX e Zsh) – Kreisquadratur

Problemi correlati