GNU制作和使用;在同一命令shell

时间:2016-03-23 10:30:59

标签: windows shell makefile

我在Windows上使用GNU Make 3.81时遇到了一个非常基本的问题,我必须做一些非常愚蠢的事情,我相信这里有人会在几毫秒内指出它。我的问题是使用“;”在同一个shell中运行多个命令。

据我了解,make在自己的命令shell中运行每一行,因此如果要一个接一个地运行两个命令,则必须将它们放在由分号分隔的同一行上。这是最简单的形式:

all:
    echo hello; echo hello

...应该产生输出:

hello
hello

但对我来说它会产生输出:

hello; echo hello

换句话说,分号正在直接传递给shell,这对cmd.exe没有多大意义。

我现在准备好被所有人指出我出错的地方而感到尴尬......

仅供参考,我需要这个的原因是我正在使用$(foreach)循环,它必须为每次迭代执行两个shell命令。

3 个答案:

答案 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:如果您不希望命令静默失败,您也可以使用 && 代替 &