¿Por qué este fragmento con un shebang #! / Bin / sh y exec python dentro de 4 comillas simples funciona?

Estoy tratando de entender una de las respuestas a esta pregunta:

No se puede pasar un argumento a python con “#! / Usr / bin / env python”

#!/bin/sh ''''exec python -u -- "$0" ${1+"$@"} # ''' 

Esto funciona bien, pero no entiendo por qué funciona con cuatro tics al principio de esa línea en lugar de tres.

Además, ¿por qué el hash cerca del final de esa cadena?

Python soporta cadenas de comillas triples:

 '''something''' 

Shell solo admite cadenas entre comillas simples:

 'something' 

Al usar cuatro comillas, sh ve que hay 2 cadenas vacías, pero Python ve las tres primeras como el comienzo de una cadena de tres comillas, e incluye la cuarta como parte del valor de la cadena.

El rest de la línea se interpreta como un comando por sh , pero como parte de una cadena por Python.

El # luego forma un comentario en lo que respecta a sh , pero sigue siendo una cadena para Python, cerrándolo con una cita triple de cierre.

Entonces, para resumir:

  • sh ve: cadena vacía ( '' )cadena vacía ( '' )comando ( exec python -u -- "$0" ${1+"$@"} )comentario ( # ''' )
  • Python ve: literal de cadena entre comillas triples (que contiene los caracteres 'exec python -u -- "$0" ${1+"$@"} # )

Entonces sh ejecuta ese comando, reemplazándose a sí mismo con python -u -- con el nombre del script y el rest de los argumentos de la línea de comandos, y Python lee este archivo y solo ve un literal de cadena inicial que no va a ninguna parte.

Debido a que es la primera cadena literal en el archivo, se establecerá como la cadena de documentación para el módulo __main__ pero eso no importará si este es el script principal.

Yo solo uso

 #!/bin/sh ''':' exec python -tt "$0" "$@" ''' # The above shell shabang trick is more portable than /usr/bin/env and supports adding arguments to the interpreter (python -tt)