我刚刚解决了我的 Makefile 的问题。遍历每个<<<
带有错误消息的地方
/bin/sh: 1: Syntax error: redirection unexpected
我想知道为什么。 (我使用 Bash 作为SHELL
)
在我目前的项目中,我尝试了很多食谱:
target:
read FOO <<< "XXX"; \
read BAR <<< "YYY"; \
read BAZ <<< "ZZZ"; \
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
尝试此操作将导致每个错误<<<
,如开头所述。我的解决方法是
target.dep:
echo "XXX YYY ZZZ" >$@
target: %: %.dep
read FOO BAR BAZ < $<;\
someprog -a param0 -b $$FOO -c param1 -d $${BAR} -e param2 -f $${BAZ} >$@
这意味着我将我的东西放入临时文件中,然后用 读取<
,效果很好。当我将 make 输出复制粘贴到普通的 bash 提示符时,每个命令都按预期工作,即使使用<<<
.我相当确定我的问题是,使用<<<
运算符(即此处的字符串)会破坏某些内容。为什么会这样?有没有办法让这里的字符串在 Makefile 中工作?
PS:是的,有时我觉得 autotools 会比 make 更好。
答案1
/bin/sh: 1: Syntax error: redirection unexpected
意味着你是不是使用 bash 作为你的 shell,尽管你的期望相反。 bash assh
可以很好地识别这里的字符串(因此您Makefile
可以在 Fedora 上工作),但例如 dash as 则sh
不能。除非另有说明,Make 使用/bin/sh
作为它的 shell;它会忽略您的默认用户 shell。
环境
SHELL=/bin/bash
你Makefile
应该为你解决问题;至少,它对我来说在显示与您的症状相同的系统上是有效的。
PS:是的,有时我觉得 autotools 会比 make 更好。
Autotools 和 Make 不能解决同样的问题;它们是互补的,使用 Autotools 仍然意味着使用 Make...
答案2
正如您在错误消息中看到的,调用的 shellmake
不是bash
but /bin/sh
。 sh
一般不理解here-strings。
如果您将make
变量设置SHELL
为/bin/bash
(或系统上该 shell 的任何路径),它将使用bash
而不是sh
.
另请参阅相关 GNUmake
文档:https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html