我正在尝试一些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})
所有结果都相同(请参见上文)。我也扫描了these docs关于字符串扩展的信息,但是我没有问题,变量/字符串可能为null或未定义。最后一个echo
没问题,您也可以将$(git status)
的结果存储在一个变量中,并对此进行回显(在脚本中以我的方式)。
我知道,有similar questions,但是我还没有找到类似的情况,因为我只是在处理简单和非null的字符串,但是处理的(太多?)引号。
有趣的变体:
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})
工作正常。
答案 0 :(得分:2)
使用带有正确引号的bash数组...
DETAIL="test test" && command=(commit -m "$DETAIL") && git "${command[@]}"
输入您的代码:
echo "$(command)"
与command
相同(好的,删除了尾随的空换行符)"command blabla"
不执行带有第一个参数command
的文件blabla
。它将执行一个完全以空格command blabla
命名的文件名。$("git ${command}")
内部执行名为git commit -m 'test test'
的文件名(确切地说,这是扩展${command}
后的整个文件名,带空格)。在您的系统上,找不到名为git commit -m 'test test'
的文件bash返回命令。