以下sed在basho中完美运行:
pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -)
然而,当我将它添加到制作目标时:
$(shell pkexec /opt/texbin/tlmgr install $(cat source/*.md | sed -n 's~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$~\1~p' | paste -sd ' ' -))
我收到错误:
/bin/sh: 1: Syntax error: Unterminated quoted string
答案 0 :(得分:1)
我认为错误实际上是如何使扩展$
变量引用和函数调用的副作用。您的示例有两个问题:
$(cat …)
,但是make会扩展这个(什么都没有),类似于它展开($shell …)
的方式。您需要编写$$(cat …)
,以便将美元符号传递给shell。)
被视为make函数调用的终结符(cat
,因为它已写入,但它可能是shell
)。要修复第二个问题,请将正则表达式放入make变量,将$
加倍:
regexp = s~^[^%]*\\usepackage[^{]*{\([^}]*\)}.*$$~\1~p
从sed命令引用它:
$(shell pkexec /opt/texbin/tlmgr install $$(cat source/*.md | sed -n '$(regexp)' | paste -sd ' ' -))
现在)
对make函数调用解析器是隐藏的,不再混淆它。 '…'
仍然是必要的,以防止正则表达式的shell扩展。