Comment définir tous les sous-répertoires d'un répertoire dans $ PATH?

38

Il semble que lors de l'ajout d'un répertoire dans $ PATH, ses sous-répertoires ne soient pas ajoutés de manière récursive. Alors je peux faire ça? Ou y a-t-il une raison pour laquelle cela n'est pas pris en charge?

Tim
la source
5
Pourquoi as-tu besoin de ça?
alex
10
@alex: Pourquoi pensez-vous qu'il n'y a pas besoin?
Tim
4
@Tim la raison pour laquelle il n'est pas "généralement" pris en charge est que c'est un risque pour la sécurité et n'est généralement pas nécessaire. Si vous ajoutez de manière récursive des répertoires à votre chemin, ceux qui savent ce qui risque de s'y coincer ... rendent l’audit beaucoup plus difficile.
xenoterracide
4
@ Tim: C'est une chose vraiment surprenante et inhabituelle, c'est pourquoi.
alex
8
@alex Qu'en est-il des sous-répertoires dans le répertoire bin? j'aimerais organiser les scripts dans des répertoires du dossier bin.
Andy

Réponses:

19

Ajoutez-les récursivement en utilisant find like so:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

AVERTISSEMENT: comme indiqué dans les commentaires à la question, cela n'est pas encourageant car cela pose un risque pour la sécurité car rien ne garantit que les fichiers exécutables des répertoires ajoutés ne sont pas malveillants.

C'est probablement une meilleure solution de suivre la réponse de Gilles et d'utiliser stow

vschum
la source
6
Avertissement: Cette réponse est techniquement correcte, mais comme le notent alex et xenoterracide, il s’agit d’une tâche insécurisante et vous devez absolument y réfléchir à deux fois avant de l’utiliser.
Caleb
2
Veuillez ajouter un avertissement à votre réponse expliquant pourquoi ce n’est pas une bonne chose à faire en toute sécurité.
Caleb
3
Je ne considérerais pas cela particulièrement dangereux . l'ajout de répertoires aléatoires $PATHest dangereux, mais l'ajout de sous-répertoires n'est pas pire. Mais cela est généralement inutile et peut-être inefficace (et peut même vous amener parfois à des limites de taille d'environnement).
Gilles 'SO- arrête d'être méchant'
3
@Caleb: fou peut-être, mais pourquoi peu sûr? Si quelqu'un a le droit d'ajouter des fichiers exécutables malveillants dans des sous-répertoires, il peut également les ajouter au répertoire parent (c'est-à-dire, ~/binou ~/scripts), afin que leur sécurité soit la même.
MestreLion
2
Risque de sécurité si vous travaillez dans un environnement où des personnes aléatoires peuvent ajouter des fichiers malveillants à votre ordinateur ~/scripts. Moi non plus, personne ne le devrait
oseiskar
21

La structure de répertoires unix habituelle contient des fichiers d’application classés par type: binpour les exécutables, libpour les bibliothèques, docpour la documentation, etc. C'est quand ils sont installés dans des répertoires séparés; souvent les applications sont regroupées dans quelques répertoires ( d' où de nombreux systèmes ont seulement trois répertoires $PATH: /usr/local/bin, /usr/binet /bin). Il est rare d’avoir à la fois des fichiers exécutables et des sous-répertoires dans un répertoire. Il n’est donc pas nécessaire d’inclure les sous-répertoires d’un répertoire dans $PATH.

Il peut parfois être utile d’inclure tous les binsous - répertoires des sous-répertoires d’un répertoire donné dans $PATH:

for d in /opt/*/bin; do PATH="$PATH:$d"; done

Cependant, cela est rarement fait. La méthode habituelle lorsque des exécutables situés dans des répertoires non standard doivent être insérés $PATHconsiste à créer des liens symboliques dans un répertoire du chemin tel que /usr/local/bin. L' stowutilitaire (ou xstow) peut être utile à cet égard.

Gilles, arrête de faire le mal
la source
4

Une des raisons pour lesquelles cela n'est pas pris en charge est que les répertoires bin / (et similaires) utilisent des liens symboliques pour pointer vers les répertoires spécifiques dans lesquels les exécutables réels des programmes sont installés.

Donc, si vous $PATHincluez /usr/local/bin(ce qu’il fait probablement), ce dossier est plein de liens symboliques (comme ruby) qui pointent vers le répertoire spécifique dans lequel se trouve le code d’exécution de ruby ​​(comme ../Cellar/ruby/2.1.3/bin/ruby).

C'est pourquoi vous n'avez pas à spécifier le dossier de chaque exécutable dans votre $PATH; les liens symboliques habituellement trouvés dans les répertoires bin / type gèrent cela pour vous.

jeffmjack
la source
1

Dans zsh , $ PATH peut être ajouté en tant que tableau. Vous pouvez utiliser le shell globbing pour ajouter plusieurs sous-répertoires au tableau $ PATH.

Exemple:

Dans .zshrc:

typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH

Cela ajoutera tous les sous-répertoires de $ BINPATH au tableau $ PATH.

anon_stackoverflock
la source