如何在Makefile目标中使用Bash语法?

我经常发现Bash语法非常有用,例如像中的流程替换diff <(sort file1) <(sort file2)。


是否可以在Makefile中使用此类Bash命令?我在想这样的事情:


file-differences:

    diff <(sort file1) <(sort file2) > $@

在我的GNU Make 3.80中,这将产生错误,因为它使用shell而不是bash执行命令。


慕仙森
浏览 1103回答 3
3回答

慕妹3242003

从GNU Make文档中,5.3.1 Choosing the Shell------------------------The program used as the shell is taken from the variable `SHELL'.&nbsp; Ifthis variable is not set in your makefile, the program `/bin/sh' isused as the shell.因此,将其放在SHELL := /bin/bashmakefile的顶部,您应该一切顺利。顺便说一句:您也可以针对一个目标执行此操作,至少对于GNU Make而言。每个目标可以有自己的变量分配,如下所示:all: a ba:&nbsp; &nbsp; @echo "a is $$0"b: SHELL:=/bin/bash&nbsp; &nbsp;# HERE: this is setting the shell for b onlyb:&nbsp; &nbsp; @echo "b is $$0"打印:a is /bin/shb is /bin/bash有关更多详细信息,请参见文档中的“特定于目标的变量值”。该行可以在Makefile中的任何地方进行,而不必紧接在目标文件之前。

慕慕森

您可以bash直接调用,使用-c标志:bash -c "diff <(sort file1) <(sort file2) > $@"当然,您可能无法重定向到变量$ @,但是当我尝试执行此操作时,我收到-bash: $@: ambiguous redirect一条错误消息,因此您可能想在深入了解它之前先进行研究(尽管我使用bash 3.2.something,所以也许您的工作原理有所不同)。

森栏

无需显式将SHELL变量设置为指向bash,就可以执行此操作。如果您有许多makefile,这将很有用,因为SHELL不会被后续的makefile继承或从环境中获取。您还需要确保任何编译您的代码的人都以这种方式配置他们的系统。如果运行sudo dpkg-reconfigure dash并对提示回答“否”,则系统将不使用破折号作为默认外壳程序。然后它将指向bash(至少在Ubuntu中)。请注意,虽然使用破折号作为系统外壳会更有效。
打开App,查看更多内容
随时随地看视频慕课网APP