git submodule foreach
работает в под-оболочке.Это означает, что не существует прямого способа повлиять на родительскую оболочку, и это, в свою очередь, означает, что вам нужно воздействовать на родительскую оболочку косвенно .
Существует множество способов сделать это., но простой способ - записать файл, а затем использовать source
или .
для чтения файла.Учитывая приведенный выше синтаксис, вы, вероятно, используете bash, поэтому:
git submodule foreach --recursive '[[ "$name" = *"foo"* ]] && \
( echo $path; echo "paths+=($path)" >> /tmp/paths ) || true'
source /tmp/paths
rm /tmp/paths
echo ${paths[@]}
Другой способ сделать это - eval
вывод foreach, но это сложнее, так как тогда вам нужно быть осторожным с все выход.Для этого есть удобный трюк с exec
для перенаправления различных файловых дескрипторов:
exec 1>&3
eval $(command)
, где command
расширяется (с помощью псевдонима или функции оболочки, или сценария, или чего-либо еще) до:
command() {
exec 4>&1 1>&3 3>&-
echo now we can print normally
echo var=value 1>&4 # this is a directive for the "eval"
}
Внешний 3>&1
создает копию стандартного вывода для внутреннего command
, который затем перемещает свой fd 1 в fd 4, перемещает 3 в 1 и закрывает 3. Теперь стандартный вывод внутренней команды такой же, каквнешний стандартный вывод, в то время как fd 4 - это то место, куда идут элементы eval
.