meaning go shebang

go - shebang meaning



¿Cuál es la línea apropiada de Go shebang? (4)

Los programas Go se compilan en binarios; No creo que haya una opción para ejecutarlos directamente desde la fuente.

Esto es similar a otros lenguajes compilados como C ++ o Java. Algunos lenguajes (como Haskell) ofrecen tanto un modo completamente compilado como un modo de "secuencia de comandos" que se puede ejecutar directamente desde el origen con una línea shebang.

Me gusta usar shebangs para ejecutar mis scripts de Perl directamente:

#!/usr/bin/env perl

¿Cuál es el shebang para los programas de Go?


No hay uno por defecto. Sin embargo, hay una herramienta de terceros llamada gorun que te permitirá hacerlo. https://wiki.ubuntu.com/gorun

Desafortunadamente a los compiladores no les gusta la línea shebang. No puede compilar el mismo código que ejecuta con gorun.


Prefiero esto:

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

Esto tiene varias ventajas en comparación con la respuesta de هومن جاویدپور:

  • Utiliza ''exec'' para reemplazar el nuevo proceso de shell en lugar de iniciar un proceso de nieta. Como resultado, su programa Go será un proceso secundario directo. Esto es más eficiente y también es importante para algunas situaciones avanzadas, como la depuración y el monitoreo.

  • Cotejo apropiado de argumentos. Los espacios y los caracteres especiales no causarán problemas.

  • El "///" líder cumple con más estándares que solo "//". Si solo usa "//", corre el riesgo de tropezarse con el comportamiento definido por la implementación. Aquí hay una cita de http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html :

Si una ruta de acceso comienza con dos caracteres sucesivos, el primer componente que sigue a los caracteres iniciales se puede interpretar de una manera definida por la implementación, aunque más de dos caracteres principales se tratarán como un solo carácter.

He probado esta respuesta con bash, dash, zsh y ksh.

Ejemplo:

///bin/true; exec /usr/bin/env go run "$0" "$@" package main import "fmt" func main() { fmt.Println("你好!") }


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

ejemplo:

//usr/bin/go run $0 $@ ; exit package main import "fmt" func main() { fmt.Println("Hello World!") }

ir a tratar // como un comentario de una sola línea y shell ignorar extra /