Как пройти по всем подмодулям и сохранить информацию в массив? этот массив должен быть доступен извне git submodule foreach, в приведенном ниже примере я пытаюсь сохранить все пути, в которых есть foo.

$ declare -a paths
$ git submodule foreach --recursive '[[ "$name" = *"foo"* ]] && \
 ( echo $path; paths+=($path) ) || true'
Entering 'bar-1'
Entering 'foo-1'
foo-1
Entering 'foo-2'
foo-2
Entering 'foo-8'
foo-8
Entering 'foo'
foo
Entering 'baz'
$
$ echo ${paths[@]}
$
1
rodee 23 Окт 2018 в 20:53

2 ответа

Лучший ответ

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 создает копию stdout для внутреннего command, который затем перемещает свой fd 1 на fd 4, перемещает 3 в 1 и закрывает 3. Теперь stdout внутренней команды такой же, как внешний stdout, а fd 4 - это то место, где должны быть eval - ed идут.

3
torek 23 Окт 2018 в 18:27

Запишите значения как операторы присваивания во временный файл. Загрузите временный файл.

0
jthill 23 Окт 2018 в 18:26
52955067