首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Makefile目标中使用Bash语法?

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

Stack Overflow用户
提问于 2009-02-26 05:56:16
回答 6查看 160.9K关注 0票数 245

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

可以在Makefile中使用这样的Bash命令吗?我在想这样的事情:

代码语言:javascript
运行
复制
file-differences:
    diff <(sort file1) <(sort file2) > $@

在我的GNU Make 3.80中,这将给出一个错误,因为它使用shell而不是bash来执行命令。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-26 06:04:22

从GNU Make文档中,

代码语言:javascript
运行
复制
5.3.1 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

因此,将SHELL := /bin/bash放在makefile的顶部,就可以运行了。

顺便说一句,你也可以为一个目标这样做,至少对GNU Make是这样。每个目标都可以有自己的变量赋值,如下所示:

代码语言:javascript
运行
复制
all: a b

a:
    @echo "a is $$0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo "b is $$0"

这将打印出来:

代码语言:javascript
运行
复制
a is /bin/sh
b is /bin/bash

有关详细信息,请参阅文档中的“特定于目标的变量值”。这一行可以放在Makefile中的任何位置,它不一定要紧跟在目标之前。

票数 452
EN

Stack Overflow用户

发布于 2009-02-26 06:03:32

您可以使用-c标志直接调用bash

代码语言:javascript
运行
复制
bash -c "diff <(sort file1) <(sort file2) > $@"

当然,您可能无法重定向到变量$@,但是当我尝试这样做时,我得到了一条错误消息-bash: $@: ambiguous redirect,因此您可能希望在深入了解之前查看一下(尽管我使用的是bash3.2,所以您的可能工作方式有所不同)。

票数 24
EN

Stack Overflow用户

发布于 2009-02-26 06:11:43

您可以直接在Makefile中调用bash,而不是使用默认的shell:

代码语言:javascript
运行
复制
bash -c "ls -al"

而不是:

代码语言:javascript
运行
复制
ls -al
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/589276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档