¿Cuál es la diferencia entre “#! / Usr / bin / env bash” y “#! / Usr / bin / bash”?

En el encabezado de un script bash , ¿cuál es la diferencia entre esas dos declaraciones?

  1. #!/usr/bin/env bash

  2. #!/usr/bin/bash

Cuando traté de ver la página de env man, obtengo esta definición:

  env - run a program in a modified environment 

Qué significa eso?

Ejecutar un comando a través de /usr/bin/env tiene la ventaja de buscar cualquiera que sea la versión predeterminada del progtwig en su entorno actual.

De esta manera, no tiene que buscarlo en un lugar específico en el sistema, ya que esas rutas pueden estar en diferentes ubicaciones en diferentes sistemas. Mientras esté en tu camino, lo encontrará.

El inconveniente es que, dado que no está llamando a un ejecutable explícito, tiene el potencial de errores, y en los problemas de seguridad de los sistemas multiusuario (si alguien logró obtener su ejecutable llamado bash en su camino, por ejemplo).

 #!/usr/bin/env bash #lends you some flexibility on different systems #!/usr/bin/bash #gives you explicit control on a given system of what executable is called 

En algunas situaciones, puede preferirse la primera (como ejecutar secuencias de comandos de python con múltiples versiones de python, sin tener que volver a trabajar la línea ejecutable). Pero en situaciones donde la seguridad es el foco, se preferiría la última, ya que limita las posibilidades de inyección de código.

Usando #!/usr/bin/env NAME hace la búsqueda del shell para la primera coincidencia de NAME en la variable de entorno $ PATH. Puede ser útil si no conoce la ruta absoluta o no desea buscarla.

En lugar de definir explícitamente la ruta al intérprete como en /usr/bin/bash/ , utilizando el comando env, el intérprete se busca y se inicia desde donde se encuentra por primera vez. Esto tiene ventajas y desventajas

Me resulta útil, porque cuando no sabía acerca de env, antes de comenzar a escribir el script, estaba haciendo esto:

 type nodejs > scriptname.js #or any other environment 

y luego estaba modificando esa línea en el archivo en shebang.
Estaba haciendo esto, porque no siempre recordaba dónde está nodejs en mi computadora – / usr / bin / o / bin /, así que para mí env es muy útil. Tal vez hay detalles con esto, pero esta es mi razón