script ejemplo ejecutar desde comillas archivo agregar python bash arguments sh shebang

ejecutar - script python ejemplo



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

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 comienzo de esa línea en lugar de tres.

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


Python admite cadenas de comillas triples:

''''''something''''''

Shell solo admite cadenas de comillas simples:

''something''

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

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

El # forma un comentario en cuanto a sh , pero sigue siendo una cadena para Python, cerrándola con una comilla 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 de comillas triples (que contiene los caracteres ''exec python -u -- "$0" ${1+"$@"} # )

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

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


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)