bash: установить переменную окружения из exec поиска - PullRequest
0 голосов
/ 17 апреля 2011

Я хотел бы найти все каталоги в текущем рабочем каталоге и его подкаталогах, которые являются либо корнем репозитория git, либо вообще не отслеживаются git.

Для этого я написал этот bashscript:

#!/bin/bash
export FOUND_UNTRACKED=0
export FOUND_TRACKED=
find . -type d \( \( -exec test -d {}\.git \; -exec /bin/bash -c "export FOUND_TRACKED=$1:$FOUND_TRACKED" {} \; -prune \) -o -exec echo Untracked directory: {} \; -exec /bin/bash -c "export FOUND_UNTRACKED=1" \; \)

echo $FOUND_UNTRACKED
echo $FOUND_TRACKED

Поиск работает нормально, но, к сожалению, изменения в переменной среды внутри exec не распространяются.Т.е. FOUND_TRACKED всегда пусто, FOUND_UNTRACKED равно 0.

Есть идеи, как заставить этот материал работать?

Ответы [ 3 ]

1 голос
/ 17 апреля 2011

Процесс наследует окружение от родителя.Не существует простого механизма воздействия на среду родителя: дочерний процесс может изменить свою собственную среду, но он просто отбрасывается при выходе из дочернего процесса.Ваш bash-скрипт запускает find в дочернем процессе, который, в свою очередь, запускает еще один bash в следующем подпроцессе.

Один из способов обойти эту проблему - заставить дочерний процесс создать вывод, которыйродитель потом интерпретирует.Вот простой пример:

files="$( /bin/ls )"
if [ "$files" ]; then
    echo "found some files"
else
    echo "no files there"
fi

Если вам нужна более сложная обратная связь от дочернего процесса, вы можете создать временный файл (используя mktemp) в родительском процессе и заставить дочерние процессы сохранить свои выходные данные.к этому, чтобы вы могли обработать вывод в родительском элементе после завершения дочерних процессов.

0 голосов
/ 17 апреля 2011

Хотя я согласен с другими ответами - я не могу найти полезность вашего выражения find для пользователя git. .Git dir находится только в корне ... поэтому вы в конечном итоге сообщаете о подкаталогах git как "не отслеженные", что неверно.

Это отличается от других SCM, таких как CVS, где есть каталог CVS на каждом уровне каталога

0 голосов
/ 17 апреля 2011

Переместите экспорт за пределы find, поскольку он будет выполняться в подоболочке, поэтому любые экспортируемые переменные будут находиться только в этой оболочке.

...