来自docs:
...您可以修改
.SHELLFLAGS
以将-e
选项添加到shell中 在命令行中的任何地方导致任何失败导致shell 失败...
所以,给定一个makeile,例如:
.SHELLFLAGS = -e -c
define cmd
echo true
true
endef
all::
$(shell $(cmd))
正在运行,我得到:
truetrue
/bin/sh: 1: truetrue: not found
makefile:10: recipe for target 'all' failed
make: *** [all] Error 127
你看到了吗(在输出的第一行)? truetrue? 它是从哪里来的?
我们将其与以下 相同的 makefile进行比较,其中-e
未添加到.SHELLFLAGS
。
makefile,将是:
# Do you see the difference, from the previous Makefile?
# Here, the value is '-c' alone. No '-e' flag is present here!
.SHELLFLAGS = -c
define cmd
echo true
true
endef
all::
$(shell $(cmd))
正在运行,我得到:
true true
好多了!
因此,我们在这里有2个版本的makefile,都运行相同的命令,其中第一个版本还将-e
标志添加到.SHELLFLAGS
。
然而,结果 - 对于各自的运行 - 并不一致!我们有:
true true
,类似于简单命令: true
(即“忽略参数......”),因此退出状态:0。
.SHELLFLAGS
的变化。 (第2版)。truetrue
(真的吗?),因此:一个无意义的命令和来自shell的致命错误。总结:似乎将-e
添加到.SHELLFLAGS
并不像上面提到的文档那样无辜。
实际上,Make,然后(当.SHELLFLAGS被修改为包含-e
)时,只有那时 - Make可以自由地对命令进行更多(意外?)修改,结果 - 例如 - 这里使用命令truetrue
表示true true
命令。
真的?
(版本 - 注释:支持.SHELLFLAGS
的所有版本,即3.82及更高版本。)
答案 0 :(得分:0)
我从未理解在食谱中使用$(shell ...)
。可能有一两个
它有用的情况,但我经常看到它,我还没有看到它。
但是,您会注意到文档中说的值为
.SHELLFLAGS
当您要使用-e
标记时,-ec
应为-e -c
,而不是-ec
。
某些版本的Bourne shell不接受命令上的多个标志
line:它们必须是一组标志。如果你使用.SHELLFLAGS
那么你的例子
的工作原理。
你所看到的行为差异在于对新行的处理
食谱:在某些情况下,它们与初始TAB一起被删除,在另一些情况下
他们被转换为单一空间的情况。我不知道为什么要加一秒钟
string[] Demo;
string[,] Demo;
string[,,] Demo;
的选项导致了这一点,但我同意tripleee:你应该这样做
file a bug