Possibilité d'ajouter tous les sous-répertoires lors de l'ajout d'un répertoire à $ PATH

7

Lorsque vous ajoutez un répertoire à $ PATH par PATH = ~ / mon_programme / bin: "$ {PATH}"

  1. est-il vrai que seuls les exécutables directement sous le répertoire sera trouvé via $ PATH, mais d'autres les exécutables sous ses sous-directeurs ne sera pas?
  2. est-il possible de faire tous ses sous-répertoires ajoutés? parfois spécifier tous les sous-répertoires explicitement peut être beaucoup de travail quand il y en a beaucoup.

Merci et salut!

    
posée Tim 03.04.2011 - 06:34
la source

4 réponses

5

Ce script utilise tree ...

  • sudo apt-get install tree

Vous pouvez modifier la profondeur des répertoires en modifiant -L 1
et vous pouvez choisir d'utiliser ou non ~/ ...

MISE À JOUR 2 :
.. a modifié le script pour ne remplacer qu'un premier / home / utilisateur / (pas "aucun")
.. et ajouté args ..

UPDATE Ajout du contrôle: .. Ne pas ajouter le répertoire à PATH quand il est déjà dans PATH .. Cette vérification considère que «~ /» et «/ home / user /» sont différents.

Re votre question 1 ... oui c'est vrai; chaque répertoire spécifique doit être spécifié individuellement dans le PATH ..

Re votre question 2 ... Voici un script qui fera ce que vous voulez ..
Je l'ai testé, mais en l'état, il fera le nouveau PATH pour la session en cours.
Pour le rendre permanent, vous pouvez utiliser export PATH (mais je suis un peu sur les détails de export )

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="" # valid mode values: "tilde", or  anything else   
maindir=""; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L  -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo
    
réponse donnée Peter.O 03.04.2011 - 14:23
la source
2

Ce n’est pas possible, car les systèmes UNIX ne sont pas conçus pour fonctionner comme ça. En règle générale, tous les fichiers exécutables sont stockés dans un petit nombre de répertoires. Par exemple, tout ce que j'écris à mes propres fins se trouve dans ~ / bin.

Si vous ne souhaitez pas que vos binaires et scripts réels soient intégrés dans un répertoire bin, vous pouvez créer un lien symbolique, par exemple ~ / bin, vers le fichier binaire réel.

Avoir tous les sous-répertoires de $ PATH n'est pas particulièrement souhaitable, car il ajoute simplement plus de répertoires à la recherche, augmente le risque que d'autres exécutables ne soient pas présents dans votre PATH et ne donne pas vraiment avantage.

    
réponse donnée Scott Severance 03.04.2011 - 12:32
la source
2

Cela devrait faire le travail

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

Veuillez prendre en compte que

  • L'arborescence complète sera parcourue, ce qui peut prendre un certain temps, alors essayez de garder la hiérarchie réduite.
  • Cela ne tiendra pas compte des répertoires créés après la définition du PATH.
  • Si vous invoquez cela plusieurs fois, il y aura beaucoup de doublons dans le PATH. Vous voudrez peut-être attribuer le PATH d'origine à une variable temporaire (par exemple, OLD_PATH).
réponse donnée Adam Byrtek 03.04.2011 - 12:49
la source
1

Non, ce n’est pas facile. Serait-il possible d'ajouter des liens vers tous les exécutables vers "~ / my_program / bin"?

    
réponse donnée ddeimeke 03.04.2011 - 08:44
la source

Lire d'autres questions sur les étiquettes