我正在尝试使用shell脚本,该脚本应该在同一级别上为多个存储库运行git命令。这个项目结构可能是一个坏主意,但这是另一回事。
一切正常,直到我遇到这个问题:
DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $(git ${command})
# -> error: pathspec 'test'' did not match any file(s) known to git.
我也尝试过其他机会,比如
DETAIL="test test" && command="commit -m ${DETAIL}" && echo $(git ${command})
DETAIL="test test" && command="commit -m $DETAIL" && echo $(git ${command})
都给出相同的结果(见上文(。我还扫描了这些关于字符串扩展的文档,但我没有问题,变量/字符串可能是空的或未定义的。最后一个echo
不是问题,您还可以将$(git status)
的结果存储在变量中并回显这个变量(我在脚本中的方式(。
我知道,有类似的问题,但我还没有找到类似的情况,因为我只是在处理简单和非空字符串,但(太?(很多引号。
有趣的变体:
DETAIL="test test" && command="commit -m '${DETAIL}'" && echo $("git ${command}")
# -> git commit -m 'test test': command not found # WHAT?
也很有趣,只是:
command="commit -m 'test'" && echo $(git ${command})
工作正常。
使用带有正确引号的 bash 数组...
DETAIL="test test" && command=(commit -m "$DETAIL") && git "${command[@]}"
到您的代码:
-
echo "$(command)"
与command
相同(好的,删除尾随空换行符( -
"command blabla"
不会使用第一个参数blabla
执行文件command
。它将执行一个完全以空格command blabla
命名的文件名。 - 在
$("git ${command}")
中,您要执行一个名为git commit -m 'test test'
的文件名(确切地说,这是展开后的整个文件名,带空格${command}
(。与系统上一样,没有名为git commit -m 'test test'
bash 返回命令的文件未找到。