如何递归到所有子模块并将信息保存到数组中? 该数组应该可以从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[@]}
$
git submodule foreach
在子外壳中运行。 这意味着没有直接的方法可以影响父 shell,反过来,这意味着您需要间接影响父 shell。
有许多方法可以做到这一点,但一个简单的方法是写入文件,然后使用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
扩展(通过别名或 shell 函数、脚本或其他任何(为:
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。 现在内部命令的 stdout 与外部 stdout 相同,而 fd 4 是要eval
-ed 的项目所在的位置。
将值作为赋值语句写入临时文件。获取临时文件。