2014-12-19 111 views

回答

0

从GNU进行手动的部分5.3 Recipe Execution

当是时候来执行食谱更新目标,他们通过调用一个新的子壳为配方的每一行执行,除非该.ONESHELL特殊目标有效(请参阅使用一个shell)(实际上,make可能会采用不影响结果的快捷方式。)

请注意:这意味着要设置shell变量并调用shell命令,例如cd设置每个进程的本地上下文不会影响配方中的以下行。如果要使用cd来影响下一个语句,请将两条语句都在一个配方行中。然后make将调用一个shell来运行整个行,并且shell将按顺序执行这些语句。例如:

foo : bar/lose 
     cd $(@D) && gobble $(@F) > ../[email protected] 

这里我们使用壳牌和运营商(& &),这样,如果cd命令失败,脚本将不尝试在错误的目录调用狼吞虎咽命令失败,这可能会导致问题(在这种情况下,它肯定会导致../foo被截断,至少)。

使用反斜杠将命令分割为多行。正如手册的5.1 Recipe Syntax部分所详细解释的那样。

make解释食谱的几种方法之一是在换行符之前检查反斜线。和通常的makefile语法一样,通过在每个换行符之前放置一个反斜杠,可以将单个逻辑配方行分割成makefile中的多条物理行。像这样的一系列行被认为是单一的配方行,并且会调用一个shell实例来运行它。

+0

要在一个单壳中,整行需要被'('和')'包围 – user3629249 2014-12-19 11:33:32

+0

@ user3629249不,它没有。这样做会启动一个(无意义的)子shell。 – 2014-12-19 12:32:55

4

之间的差值。当多条线路被连接通过用反斜杠转义换行符,它们将全部运行在同一个shell中。如果使用shell变量,这可能很重要。当每个命令出现在它自己的行上时,它们将分别运行在一个新的shell中。