bash: установить переменную окружения из exec поиска

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

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

#!/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 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам