Как пройти по всем подмодулям и сохранить информацию в массив? этот массив должен быть доступен извне 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 ответа
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 идут.
Запишите значения как операторы присваивания во временный файл. Загрузите временный файл.
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.