linux - shebang meaning
¿Cuál es la diferencia entre “#!/Usr/bin/env bash” y “#!/Usr/bin/bash”? (4)
Ejecutar un comando a través de /usr/bin/env
tiene la ventaja de buscar cualquiera que sea la versión predeterminada del programa en su entorno actual.
De esta manera, no tiene que buscarlo en un lugar específico del 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 cometer errores, y en los problemas de seguridad de los sistemas multiusuario (por ejemplo, si alguien logró obtener su ejecutable llamado bash
en su ruta).
#!/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, se puede preferir el primero (como ejecutar scripts de Python con varias versiones de python, sin tener que volver a trabajar la línea ejecutable). Pero en situaciones donde la seguridad es el enfoque, este último sería preferible, ya que limita las posibilidades de inyección de código.
En el encabezado de un script de bash
, ¿cuál es la diferencia entre esas dos afirmaciones?
#!/usr/bin/env bash
#!/usr/bin/bash
Cuando intenté ver la página de manual de env
, obtengo esta definición:
env - run a program in a modified environment
Qué significa eso?
En lugar de definir explícitamente la ruta al intérprete como en /usr/bin/bash/
, mediante el comando env, se busca y se inicia el intérprete desde donde se encuentra por primera vez. Esto tiene ventajas y desventajas
Me parece útil, porque cuando no sabía sobre 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 estaba 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
Usando #!/usr/bin/env NAME
hace que 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.