Justificación de la /
regla POSIX PATH
La regla se mencionó en: ¿Por qué necesita ./ (punto-barra) antes del ejecutable o el nombre del script para ejecutarlo en bash?pero me gustaría explicar por qué creo que es un buen diseño con más detalle.
Primero, una versión completa explícita de la regla es:
- Si la ruta contiene
/
(por ejemplo ./someprog
, /bin/someprog
,./bin/someprog
): se usa CWD y PATH no
- si la ruta no contiene
/
(p someprog
. ej. ): se utiliza PATH y CWD no
Ahora, supongamos que se ejecuta:
someprog
buscaría:
- en relación con CWD primero
- relativo a la RUTA después
Entonces, si querías huir /bin/someprog
de tu distribución, y lo hiciste:
someprog
a veces funcionaría, pero otras fallaría, porque podría estar en un directorio que contiene otro no relacionado someprog
programa .
Por lo tanto, pronto aprenderá que esto no es confiable, y terminaría siempre usando rutas absolutas cuando quiera usar PATH, por lo tanto, anulará el propósito de PATH.
Esta es también la razón por la que tener rutas relativas en su RUTA es una muy mala idea. Te estoy mirandonode_modules/bin
.
Por el contrario, supongamos que se ejecuta:
./someprog
Buscaría:
- relativo a la RUTA primero
- relativo a CWD después
Luego, si acaba de descargar un script someprog
de un repositorio de git y desea ejecutarlo desde CWD, nunca estaría seguro de que este es el programa real que se ejecutaría, porque tal vez su distribución tiene un:
/bin/someprog
que está en su RUTA de algún paquete que instaló después de beber demasiado después de Navidad el año pasado.
Por lo tanto, una vez más, se vería obligado a ejecutar siempre scripts locales en relación con CWD con rutas completas para saber lo que está ejecutando:
"$(pwd)/someprog"
lo cual sería extremadamente molesto también.
Otra regla que podría verse tentado a inventar sería:
las rutas relativas solo usan RUTA, las rutas absolutas solo CWD
pero una vez más, esto obliga a los usuarios a usar siempre rutas absolutas para scripts que no son de RUTA con "$(pwd)/someprog"
.
La /
regla de búsqueda de ruta ofrece una solución fácil de recordar para el problema:
- barra oblicua: no use
PATH
- sin barra: solo use
PATH
lo que hace que sea muy fácil saber siempre lo que está ejecutando, confiando en el hecho de que los archivos en el directorio actual se pueden expresar como ./somefile
o somefile
, por lo que le da un significado especial a uno de ellos.
A veces, es un poco molesto que no se puede buscar en some/prog
relación PATH
, pero no veo una solución más sensata para esto.