2009-09-14 48 views
30

Necesito permitir que varias aplicaciones se agreguen a una variable del sistema ($ PYTHONPATH en este caso). Estoy pensando en designar un directorio donde cada aplicación pueda agregar un módulo (por ejemplo, .bash_profile_modulename). Intentado algo como esto en ~/.bash_profile:fuente de todos los archivos en un directorio de .bash_profile

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

pero no parece funcionar.

+1

Un script de prueba rápida funciona para mí. ¿Puede ser más específico en cuanto a lo que contienen sus archivos y lo que "no parece funcionar" significa? –

+0

Los archivos se ven como: export PYTHONPATH =/testpath /: $ PYTHONPATH El problema es que no agrega/testpath/a la PYTHONPATH. –

+3

Solo para explicar por qué el script original no funciona: los archivos se obtienen en un ciclo while en una canalización; Los builtins de bash utilizados en las tuberías se ejecutan en subcapas, por lo que cualquier elemento definido por los archivos de origen desaparece cuando sale de la subcapa. La solución (como en las respuestas a continuación) es eliminar la tubería. –

Respuesta

54

No sería

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

ser suficiente?

Editar: capa adicional de ls ~/.bash_* simplificada para dirigir bash globbing.

+2

para f en ~/.bash_profile_ *; hacer fuente $ f; hecho debería funcionar también; Bash puede manejar el globbing. –

+1

Emil: Estás en lo correcto. Gracias por la sugerencia. –

+0

Dirk, debe editar su respuesta con la sugerencia de Emil. –

17

Estoy de acuerdo con Dennis arriba; su solución debería funcionar (aunque el punto y coma después de "hecho" no debería ser necesario). Sin embargo, también se puede utilizar un bucle

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

La sustitución de comandos de ls no es necesario, como en la respuesta de Dirk. Este es el mecanismo utilizado, por ejemplo, en /etc/bash_completion para obtener otros scripts de finalización de bash en /etc/bash_completion.d

+1

Creo que necesitas presupuestos. '. "$ f" '. Aparte de eso, la mejor respuesta. –

-1

bien, entonces lo que terminé haciendo;

eval "$(find perf-tests/ -type f -iname "*.test" | while read af; do echo "source $af"; done)" 

este ejecutará una fuente en el shell actual y todas las variables maintian ...

-3

Creo que sólo debe ser capaz de hacer bash

source ~/.bash_profile_*

+1

Estaba pensando lo mismo, pero probé y no pude hacerlo funcionar. Me parece que 'fuente' solo toma un argumento (e ignora los argumentos superfluos). Estoy bastante seguro de que eso es una mierda. – bryn

2

aus:

fuente nombre de archivo [argumentos]

ein config fuente será leído/*

El primer argumento y todos los demás archivos de configuración/serán argumentos a la secuencia de comandos que fuentes.

8

Oneliner (sólo para bash/zsh):

source <(cat *) 
+1

También funciona para zsh. – fangxing

+0

Esto no funciona para Bash. Obtiene un "nombre" de error: ¡es un directorio –

+0

@BalajiBoggaramRamanarayan de causa si tiene directorios allí! La pregunta es sobre archivos. Encuentra máscara que incluirá solo archivos. – gaRex

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

Esta solución es la más contabilizable que he encontrado, hasta el momento: * No da ningún error si no hay archivos que coinciden * trabaja con múltiples conchas incluyendo bash, zsh plataforma cruzada * (Linux, MacOS, ...)

0
str="$(find . -type f -name '*.sh' -print)" 
arr=($str) 
for f in "${arr[@]}"; do 
    [[ -f $f ]] && . $f --source-only || echo "$f not found" 
done 

probé y lo estoy usando. Simplemente modifica el. after find para apuntar a tu carpeta con tus scripts y funcionará.

Cuestiones relacionadas