¿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?

Tim
fuente
55
¿Por qué demonios necesitas eso?
alex
10
@alex: ¿Por qué crees que no hay necesidad?
Tim
44
@ 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

vschum
fuente
66
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.

Gilles 'SO- deja de ser malvado'
fuente
4

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.

jeffmjack
fuente
1

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.

anon_stackoverflock
fuente