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


8

Lors de l'ajout d'un répertoire à $ PATH par PATH = ~ / mon_programme / bin: "$ {PATH}"

  1. est-il vrai que seuls les exécutables directement sous le répertoire seront trouvés via $ PATH, mais pas les autres exécutables sous ses sous-répertoires?
  2. est-il possible d'ajouter tous ses sous-répertoires? Parfois, spécifier explicitement tous les sous-répertoires peut représenter beaucoup de travail lorsqu'il y en a plusieurs.

Merci et salutations!

Réponses:


5

Ce script utilise tree...

  • sudo apt-get install tree

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

MISE À JOUR 2 :
.. a modifié le script pour remplacer uniquement un début / home / utilisateur / (pas "tout")
.. et a ajouté des arguments ..

MISE À JOUR Ajout de vérification: .. N'ajoutez pas de 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 CHEMIN.

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 sommaire 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="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; 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 $3 -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

3

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

Si vous ne voulez pas que vos binaires et scripts réels vivent dans un répertoire bin, vous pouvez créer un lien symbolique dans, par exemple, ~ / bin vers le binaire réel.

Avoir tous les sous-répertoires dans $ PATH n'est pas particulièrement souhaitable, car cela ajoute simplement plus de répertoires à la recherche, augmente le risque que d'autres exécutables pénètrent dans votre PATH qui ne devraient pas être là, et ne donne pas vraiment beaucoup d'avantages.


3

Cela devrait faire le travail

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

Veuillez prendre en compte que

  • L'arborescence de répertoires entière sera parcourue, ce qui peut prendre un certain temps, alors essayez de garder la hiérarchie petite.
  • Cela ne prendra pas en compte les répertoires créés après la définition du PATH.
  • Si vous l'invoquez plusieurs fois, il y aura beaucoup de doublons dans le CHEMIN. Vous voudrez peut-être affecter le PATH d'origine à une variable temporaire (par exemple, OLD_PATH).

Deux bugs: il n'ajoute pas de chemins absolus -> ne fonctionne pas correctement. En outre, il ajoute deux doubles-points. Supprimer: après $ PATH.
Olli

1

Non, ce n'est pas possible de manière simple. Serait-il possible d'ajouter des liens logiciels à tous les exécutables dans "~ / mon_programme / bin"?


1

Essayez-le de cette façon:

export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"

Cela s'ajoutera ~/.local/binavec tous ses sous-répertoires dans $PATH.

Explication:

  • du affichera toutes les informations des sous-répertoires de chaque ligne
  • cut -f2 extraira la deuxième colonne, c'est-à-dire les noms des sous-répertoires
  • tr '\n' ':'changera chaque rupture de lien en deux points. Cela réunira toutes les lignes en une seule ligne et les sous-répertoires sont délimités par deux points
  • sed 's/:*$//' supprimera le dernier colon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.