Как получить доступ к переменным, используемым в «git submodule foreach» извне? - PullRequest
0 голосов
/ 23 октября 2018

Как записаться во все подмодули и сохранить информацию в массив?этот массив должен быть доступен извне 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[@]}
$

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

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.

0 голосов
/ 23 октября 2018

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

...