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, так как он будет выполняться в подоболочке, чтобы любые экспортируемые переменные находились только в этой оболочке.