¿Hay alguna garantía de que / usr / bin / env existirá?

8

A menudo veré que los scripts comienzan con una línea shebang que se usa #!/usr/bin/env interpreter_namepara cualquier intérprete, con la razón de que los diferentes sistemas pueden tener el intérprete que necesitan para ejecutarse en diferentes lugares. Por ejemplo, si supongo que pythonestá instalado, /usr/bin/pythonentonces algún usuario que decidió instalarlo, /opt/pythonpor alguna razón, no podrá usarlo tan fácilmente.

Pero la pregunta obvia es, ¿hay alguna garantía de que envse instalará en /usr/bin/env(o para el caso en algún lugar en particular), o es solo un caso de "mover el problema" por así decirlo?

Esta pregunta ligeramente relacionada tiene un comentario que dice que es una mala idea y es preferible instalarla con la ruta real del intérprete y cita la especificación de unix único, pero en realidad no aborda esta pregunta.

scott_fakename
fuente

Respuestas:

6

No, envno se garantiza que esté /usr/bin, como puede leer en el historial del mecanismo shebang , en la sección "La utilidad env":

Sin embargo, la ubicación de env (1) puede variar. Free-, Net-, OpenBSD y algunas distribuciones de Linux (por ejemplo, Debian) solo vienen con / usr / bin / env. Por otro lado, solo hay / bin / env al menos en SCO OpenServer 5.0.6 y Cray Unicos 9.0.2 (aunque este último es solo de interés histórico). En algunas otras distribuciones de Linux (Redhat) se encuentra en / bin y / usr / bin / contiene un enlace simbólico que apunta a él.

No mueve el problema por completo, debido a la flexibilidad de envbúsqueda $PATH. Si le sucede a obtener algunas secuencias de comandos que utilizan una ubicación diferente para enva la suya, que solamente tiene que saber acerca de dónde están sus envvidas, y no también cuando perl, pythony otros intérpretes puedan estar instalados.

Y no tiene que codificar /opt/python/3.3.2/bin/python3.3si ese es el primer python3.3ejecutable en su RUTA. Puede confiar en envencontrarlo, por lo que no tiene que actualizar todos y cada uno de los scripts si actualiza para usar /opt/python/3.3.3/bin/python3.3. Su encabezado de script permanece igual:

#! /usr/bin/env python3.3
Anthon
fuente
Ajá. Gracias. No pude encontrar ninguna información al respecto. Cuando dije "mover" el problema, quise decir que en lugar de buscar python perl, etc., ahora solo tienes que cazar env, entonces el mismo problema, pero un objetivo diferente. Sin envembargo, parece que es mucho más fácil de encontrar y, obviamente, mucho más versátil, por lo que sigue siendo muy favorable. Lo que responde a mi pregunta perfectamente. ¡Gracias!
scott_fakename