我在Windows上使用GNU Make 3.81时遇到了一个非常基本的问题,我必须做一些非常愚蠢的事情,我相信这里有人会在几毫秒内指出它。我的问题是使用“;”在同一个shell中运行多个命令。
据我了解,make在自己的命令shell中运行每一行,因此如果要一个接一个地运行两个命令,则必须将它们放在由分号分隔的同一行上。这是最简单的形式:
all:
echo hello; echo hello
...应该产生输出:
hello
hello
但对我来说它会产生输出:
hello; echo hello
换句话说,分号正在直接传递给shell,这对cmd.exe没有多大意义。
我现在准备好被所有人指出我出错的地方而感到尴尬......
仅供参考,我需要这个的原因是我正在使用$(foreach)循环,它必须为每次迭代执行两个shell命令。
答案 0 :(得分:1)
您的印象是;
是执行多个的GNU-make运算符
命令在配方中的同一个shell中。不是这样。它是 linux shell运算符
用于在同一行上标记一系列命令。它不是运营商
Windows shell,cmd
,所以当食谱:
echo hello; echo hello
在Linux上由make
执行,它具有您期望的输出,但在make
执行时
在Windows上它只是意味着回显:
hello; echo hello
答案 1 :(得分:0)
所以,答案是你的shell必须要理解;
在同一行上分隔多个命令,它与make无关。对于Windows cmd.exe
而言,情况并非如此,但对于通常使用make(Linux,msys等)的环境到达的shell,可能就是这种情况。就我而言,一个很好的解决方法就是:
define useDef
echo hello
echo hello
endef
all:
$(call useDef)
使用这种形式的“单行”定义,我可以在$(foreach)中调用多行shell命令。 Make仍然在它自己的shell中执行每个“hello”,但在我的情况下,这是正常的,因为我将输出附加到文件。如果由于某种原因需要在同一个shell中运行两个命令,那么在Windows上,您需要编写一个单独的批处理文件(我想您可以在makefile中创建)。
答案 2 :(得分:0)
我知道这个问题比较老,但我最近偶然发现了同样的问题。解决方案(对我来说)非常简单。我用 ;
替换了 &
。
基本上
all:
echo hello & echo hello
会产生
hello
hello
在 cmd.exe 中。
它也适用于 $(foreach) 循环。
UPD:如果您不希望命令静默失败,您也可以使用 &&
代替 &
。