Git submodule foreach判断子模块路径前缀时遇语法错误求解
解决git submodule foreach语法错误且保留$sm_path的方法
问题原因
git submodule foreach 默认使用系统的 /bin/sh 执行命令,而你用的 [[ ]] 是 Bash 独有的语法,sh 不支持,所以触发语法错误。直接加 bash -c 时,子 Bash 进程无法继承外层的 $sm_path 变量,导致变量失效。
可行解决方案
方案1:改用sh兼容的case语句
不需要切换shell,用sh支持的case语句实现前缀匹配:
git submodule foreach \ ' echo $sm_path case "$sm_path" in my_submodule_name*) echo found submodule starting with my_submodule_name ;; esac '
方案2:指定git用bash执行命令
通过环境变量让git submodule foreach使用bash,这样就能保留[[ ]]语法,同时正常获取$sm_path:
GIT_SHELL=/bin/bash git submodule foreach \ ' echo $sm_path if [[ $sm_path = my_submodule_name* ]] ; then echo found submodule starting with my_submodule_name fi '
方案3:手动传递$sm_path到bash子进程
如果必须用bash -c,需要转义变量让它能传入子进程:
git submodule foreach 'bash -c "echo \$sm_path; if [[ \$sm_path = my_submodule_name* ]]; then echo found submodule starting with my_submodule_name; fi"'
内容的提问来源于stack exchange,提问作者FrankPak
相关产品推荐
相关产品推荐

