¿Cómo puedo configurar todos los subdirectorios de un directorio en $ PATH?
38
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?
@ La razón por la que no es "generalmente" compatible es porque es un riesgo de seguridad y generalmente no es necesario. Si agrega directorios a su ruta de forma recursiva, quién sabe qué podría atascarse allí ... hace que sea mucho más difícil de auditar.
xenoterracide
44
@Tim: es algo realmente sorprendente e inusual querer, por eso.
alex
8
@alex ¿qué pasa con los subdirectorios en el directorio bin? Me encantaría organizar scripts en directorios en la carpeta bin.
Andy
Respuestas:
19
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
Advertencia: esta respuesta es técnicamente correcta, pero como Alex y xenoterracide observan, es una cosa insegura y definitivamente debes pensarlo dos veces antes de usar esto.
Caleb
2
Agregue una advertencia a su respuesta sobre por qué esto no es algo bueno y seguro en la práctica.
Caleb
3
No lo consideraría particularmente peligroso ; agregar directorios aleatorios $PATHes 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).
Gilles 'SO- deja de ser malvado'
3
@Caleb: quizás loco, pero ¿por qué inseguro? Si alguien tiene acceso para agregar archivos ejecutables maliciosos en subdirectorios, también podría agregarlos al directorio principal (es decir, ~/bino ~/scripts), por lo que su seguridad es la misma.
MestreLion
2
Riesgo de seguridad si trabaja en un entorno donde personas aleatorias pueden agregarle archivos maliciosos ~/scripts. Yo no y nadie más debería
hacerlo
21
La estructura de directorios habitual de Unix tiene archivos de aplicación ordenados en directorios por tipo: binpara ejecutables, libpara bibliotecas, docpara 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/biny /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 binsubdirectorios 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 $PATHes crear enlaces simbólicos en un directorio en la ruta como /usr/local/bin. La stowutilidad (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 $PATHincluye /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.
Respuestas:
Agréguelos recursivamente usando find like so:
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
fuente
$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íaLa 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
: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
. Lastow
utilidad (oxstow
) puede ser útil en ese sentido.fuente
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 (comoruby
) 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.fuente
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
:Esto agregará todos los subdirectorios de $ BINPATH a la matriz $ PATH.
fuente