我刚刚解决了我的 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 更好的选择。
意味着您没有使用 bash 作为您的外壳,尽管您的期望相反。bash as
sh
识别这里的字符串很好(所以你Makefile
可以在 Fedora 上工作),但例如 dash assh
没有。除非另有说明,否则 Make/bin/sh
用作其外壳;它会忽略您的默认用户外壳。环境
在你
Makefile
应该为你解决问题;至少,在显示与您相同症状的系统上,它对我有用。Autotools 和 Make 没有解决同样的问题。它们是互补的,使用 Autotools 仍然意味着使用 Make ...
正如您在错误消息中看到的那样,
make
调用的 shell is notbash
but/bin/sh
。sh
一般不理解here-strings。如果将
make
变量设置SHELL
为/bin/bash
(或系统上该 shell 的任何路径),它将bash
使用sh
.另请参阅https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html
make
上的相关 GNU文档