источник всех файлов в каталоге из .bash_profile - PullRequest
42 голосов
/ 14 сентября 2009

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

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

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

Ответы [ 9 ]

69 голосов
/ 14 сентября 2009

Не

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

будет достаточно?

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

17 голосов
/ 14 сентября 2009

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

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

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

15 голосов
/ 01 марта 2016

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

source <(cat *)
3 голосов
/ 22 мая 2014

aus man bash:

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

ein source config / *

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

1 голос
/ 23 марта 2017
for file in "$(find . -maxdepth 1 -name '*.sh' -print -quit)"; do source $file; done

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

  • Не выдает никакой ошибки, если нет файлов, соответствующих
  • работает с несколькими оболочками, включая bash, zsh
  • кроссплатформенность (Linux, MacOS, ...)
0 голосов
/ 08 июля 2018

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

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 голосов
/ 01 ноября 2017
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 голосов
/ 28 января 2014

Я думаю, вы просто должны быть в состоянии сделать

source ~/.bash_profile_*

0 голосов
/ 21 января 2013

хорошо, так что я в итоге сделал;

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

это выполнит источник в текущей оболочке и сохранит все переменные ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...