为什么这里使用 Bash 的 Makefile 中的字符串不起作用?

Ban*_*uin 2 bash make gnu-make

我刚刚用我的 Makefile(s) 解决了一个问题。<<<使用错误消息遍历每个

/bin/sh: 1: Syntax error: redirection unexpected
Run Code Online (Sandbox Code Playgroud)

我想知道为什么。(我使用 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} >$@
Run Code Online (Sandbox Code Playgroud)

尝试此操作将导致<<<如开头所述的每个错误。我的解决方法是

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} >$@
Run Code Online (Sandbox Code Playgroud)

这意味着我将我的东西放入临时文件中,然后我用 阅读<,这工作得很好。当我将 make 输出复制粘贴到普通的 bash 提示符时,每个命令都按预期工作,即使使用<<<. 我相当肯定我的问题是,使用<<<运算符,即这里的字符串,会破坏某些东西。为什么会这样,有没有办法让这里的字符串在 Makefile 中工作?

PS:是的,有时我觉得 autotools 比 make 更好。

Ste*_*itt 5

/bin/sh: 1: Syntax error: redirection unexpected
Run Code Online (Sandbox Code Playgroud)

意味着你没有使用 bash 作为你的 shell,尽管你有相反的期望。bash assh在这里识别字符串很好(所以你Makefile可以在 Fedora 上工作),但例如 dash assh不是。除非另有说明,Make/bin/sh用作它的外壳;它会忽略您的默认用户 shell。

环境

SHELL=/bin/bash
Run Code Online (Sandbox Code Playgroud)

在你Makefile应该为你修理东西;至少,它对我的​​系统显示与您相同的症状。

PS:是的,有时我觉得 autotools 比 make 更好。

Autotools 和 Make 没有解决同样的问题;它们是互补的,使用 Autotools 仍然意味着使用 Make...