web-dev-qa-db-fra.com

source tous les fichiers dans un répertoire de .bash_profile

Je dois autoriser plusieurs applications à être ajoutées à une variable système ($ PYTHONPATH dans ce cas). Je songe à désigner un répertoire dans lequel chaque application peut ajouter un module (par exemple .bash_profile_modulename). J'ai essayé quelque chose comme ça dans ~/.bash_profile:

find /home/mike/ -name ".bash_profile_*" | while read FILE; do
source "$FILE"
done;

mais cela ne semble pas fonctionner.

38
Mike Bannister

Ne serait pas 

 for f in ~/.bash_profile_*; do source $f; done

être suffisant?

Edit : Couche supplémentaire de ls ~/.bash_* simplifiée pour diriger bash globbing.

65
Dirk Eddelbuettel

Je suis d'accord avec Dennis ci-dessus; votre solution devrait fonctionner (bien que le point-virgule après "done" ne soit pas nécessaire). Cependant, vous pouvez également utiliser une boucle for

for f in /path/to/dir*; do
   . $f
done

La substitution de commande de ls n'est pas nécessaire, comme dans la réponse de Dirk. C'est le mécanisme utilisé, par exemple, dans /etc/bash_completion pour rechercher d'autres scripts d'achèvement de bash dans /etc/bash_completion.d

17
Cascabel

Oneliner (uniquement pour bash/zsh):

source <(cat *)
15
gaRex

aus man bash:

nom de fichier source [arguments]

ein source config/*

Le premier argument sera recherché et tous les autres fichiers de config/seront des arguments du script qu’il génère.

3
Faronitates
for file in "$(find . -maxdepth 1 -name '*.sh' -print -quit)"; do source $file; done

Cette solution est la plus postable que j'ai jamais trouvée jusqu'à présent:

  • Cela ne donne aucune erreur s'il n'y a pas de fichiers correspondants
  • fonctionne avec plusieurs shells, y compris bash, zsh
  • multiplateforme (Linux, MacOS, ...)
1
sorin
str="$(find . -type f -name '*.sh' -print)"
arr=( $str )
for f in "${arr[@]}"; do
   [[ -f $f ]] && . $f --source-only || echo "$f not found"
done 

J'ai testé et je l'utilise. Il suffit de modifier le fichier. après trouver pointer sur votre dossier avec vos scripts et cela fonctionnera.

0

Vous pouvez utiliser cette fonction pour rechercher tous les fichiers (le cas échéant) d'un répertoire:

source_files_in() {
    local dir="$1"

    if [[ -d "$dir" && -r "$dir" && -x "$dir" ]]; then
        for file in "$dir"/*; do
           [[ -f "$file" && -r "$file" ]] && . "$file"
        done
    fi
}

Les vérifications de fichier supplémentaires gèrent le cas où le motif ne correspond pas car le répertoire est vide (ce qui permet à la variable de boucle de s’étendre à la chaîne de motif elle-même).

0
Eugene Yarmash