Parece que al agregar un directorio a $ PATH, sus subdirectorios no se agregan de forma recursiva. Entonces, ¿puedo hacer eso? ¿O hay una razón por la cual esto no es compatible?
Parece que al agregar un directorio a $ PATH, sus subdirectorios no se agregan de forma recursiva. Entonces, ¿puedo hacer eso? ¿O hay una razón por la cual esto no es compatible?
Respuestas:
Agréguelos recursivamente usando find like so:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
ADVERTENCIA: Como se menciona en los comentarios a la pregunta, esto no se recomienda, ya que representa un riesgo de seguridad porque no hay garantía de que los archivos ejecutables en los directorios agregados no sean maliciosos.
Probablemente sea una mejor solución para seguir la respuesta de Gilles y usar stow
$PATH
es peligroso, pero agregar subdirectorios no es notablemente peor. Pero generalmente es inútil y posiblemente ineficiente (e incluso podría arrojarlo a límites de tamaño del entorno a veces).
~/bin
o ~/scripts
), por lo que su seguridad es la misma.
~/scripts
. Yo no y nadie más debería
La estructura de directorios habitual de Unix tiene archivos de aplicación ordenados en directorios por tipo: bin
para ejecutables, lib
para bibliotecas, doc
para documentación, etc. Ahí es cuando se instalan en directorios separados; menudo las aplicaciones se agrupan en algunos directorios (por lo tanto muchos sistemas tienen sólo tres directorios en $PATH
: /usr/local/bin
, /usr/bin
y /bin
). Es raro tener archivos ejecutables y subdirectorios dentro de un directorio, por lo que no es necesario incluir los subdirectorios de un directorio $PATH
.
Lo que ocasionalmente puede ser útil es incluir todos los bin
subdirectorios de subdirectorios de un directorio dado en $PATH
:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Sin embargo, esto rara vez se hace. El método habitual cuando se deben ejecutar ejecutables en directorios no estándar $PATH
es crear enlaces simbólicos en un directorio en la ruta como /usr/local/bin
. La stow
utilidad (o xstow
) puede ser útil en ese sentido.
Una razón por la que esto no es compatible es porque los directorios bin / (y similares) usan enlaces simbólicos para apuntar a los directorios específicos donde están instalados los ejecutables reales para los programas.
Entonces, si $PATH
incluye /usr/local/bin
(lo que probablemente hace) esa carpeta está llena de enlaces simbólicos (como ruby
) que apuntan al directorio específico donde se encuentra el código para ejecutar ruby (como ../Cellar/ruby/2.1.3/bin/ruby
).
Es por eso que no tiene que especificar la carpeta de cada ejecutable en su $PATH
; los enlaces simbólicos que se encuentran habitualmente en los directorios bin / type lo manejan por usted.
En zsh , $ PATH se puede agregar como una matriz. Puede usar el globbing de shell para agregar múltiples subdirectorios a la matriz $ PATH.
Ejemplo:
En .zshrc
:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
Esto agregará todos los subdirectorios de $ BINPATH a la matriz $ PATH.