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

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

我刚刚解决了我的 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不是bashbut /bin/shsh一般不理解here-strings。

如果您将make变量设置SHELL/bin/bash(或系统上该 shell 的任何路径),它将使用bash而不是sh.

另请参阅相关 GNUmake文档:https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html

相关内容