如何从外部访问"git submodule foreach"中使用的变量?



如何递归到所有子模块并将信息保存到数组中? 该数组应该可以从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[@]}

执行此操作的另一种方法是evalforeach 的输出,但这更棘手,因为您必须小心所有输出。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 的项目所在的位置。

将值作为赋值语句写入临时文件。获取临时文件。

最新更新