¿Cómo sabe / usr / bin / env saber qué progtwig usar?

Cuando uso el shebang #!/usr/bin/env python para ejecutar un script, ¿cómo sabe el sistema qué python usar? si busco una ruta de acceso bin en las variables de entorno, no encuentro nada.

 env | grep -i python 

Solutions Collecting From Web of "¿Cómo sabe / usr / bin / env saber qué progtwig usar?"

El shebang espera que el intérprete use una ruta completa para que la siguiente syntax sea incorrecta:

 #!python 

Establecer una ruta completa como esta podría funcionar:

 #!/usr/local/bin/python 

pero no sería portátil ya que python podría instalarse en /bin , /opt/python/bin , o en cualquier otra location.

Usando env

 #!/usr/bin/env python 

es un método que permite una forma portátil de especificar al sistema operativo una ruta de acceso completa equivalente a aquella en la que python se encuentra por primera vez en la PATH .

La línea shebang (de "sharp bang", es decir, #! ) Es procesada por el kernel. El kernel no quiere saber sobre variables de entorno como PATH . Entonces el nombre en la línea shebang debe ser una ruta absoluta a un ejecutable. También puede especificar un argumento adicional para pasar a ese ejecutable antes del nombre del script (con restricciones dependientes del sistema en las que no entraré aquí). Por ejemplo, para una secuencia de commands de Python, puede especificar

 #!/usr/bin/python 

en la primera línea, y cuando ejecutas el script, el kernel ejecutará /usr/bin/python /path/to/script . Pero eso no es conveniente: debe especificar la ruta completa del command. ¿Qué python si tiene python en /usr/bin en algunas máquinas y /usr/local/bin en otras? ¿O desea configurar su PATH a /home/joe/opt/python-2.5/bin para usar una versión específica de Python? Como el kernel no hará la búsqueda PATH por usted, la idea es hacer que el kernel ejecute un command que a su vez busca el intérprete deseado en la PATH :

 #!/fixed/path/to/path-lookup-command python 

Ese path-lookup-command debe tomar el nombre de un ejecutable como argumento y searchlo en PATH y ejecutarlo: el kernel ejecutará /fixed/path/to/path-lookup-command python /path/to/script . Como sucede, el command env hace exactamente eso. Su objective principal es ejecutar un command con un entorno diferente, pero desde que busca el nombre del command en $PATH , es perfecto para nuestro propósito aquí.

Aunque esto no está oficialmente garantizado, los sistemas históricos Unix proporcionaron env en /usr/bin , y los sistemas modernos han mantenido esa location precisamente debido al uso generalizado de #!/usr/bin/env . Por lo tanto, en la práctica, la forma de especificar que un script debe ser ejecutado por el intérprete de Python favorito del usuario es

 #!/usr/bin/env python 

Correcto, así que corre:

 env | grep PATH 

Su $ PATH es una list de directorys. Unix revisará esa list de directorys, en order, hasta que encuentre "python".

Puede ver qué directory encuentra con el command 'which':

 which python