it-swarm.com.ru

источник всех файлов в каталоге из .bash_profile

Мне нужно разрешить нескольким приложениям добавлять системную переменную (в данном случае $ PYTHONPATH). Я думаю о назначении каталога, куда каждое приложение может добавить модуль (например, .bash_profile_modulename). Попробовал что-то подобное в ~/.bash_profile:

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

но это не похоже на работу.

38
Mike Bannister

Не было бы 

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

быть достаточным?

Правка : Дополнительный слой ls ~/.bash_* упрощен для прямого bash globbing.

65
Dirk Eddelbuettel

Я согласен с Деннисом выше; ваше решение должно работать (хотя точка с запятой после «done» не должна быть обязательной). Тем не менее, вы также можете использовать цикл for

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

Подстановка команды ls не обязательна, как в ответе Дирка. Этот механизм используется, например, в /etc/bash_completion для получения других сценариев завершения bash в /etc/bash_completion.d

17
Cascabel

Oneliner (только для bash/zsh):

source <(cat *)
15
gaRex

aus man bash:

исходное имя файла [аргументы]

ein source config/*

Первый аргумент будет получен, а все остальные файлы в config/будут аргументами сценария, который он использует.

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

Это решение является самым доступным из всех, что я когда-либо нашел:

  • Это не дает никакой ошибки, если нет подходящих файлов
  • работает с несколькими оболочками, включая bash, zsh
  • кроссплатформенность (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 

Я проверил, и я использую его .... Просто измените. после find укажите вашу папку со своими скриптами, и она будет работать.

0
Christian Fröhlich

Вы можете использовать эту функцию для получения всех файлов (если они есть) в каталоге:

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
}

Дополнительные проверки файлов обрабатывают угловой случай, когда шаблон не совпадает из-за того, что каталог пуст (что приводит к расширению переменной цикла до самой строки шаблона).

0
Eugene Yarmash