在我的makefile中,我有:
all:
for i in {20..50000..10} ; do \
echo "Computing $$i" ;\
done
哪个应该在单独的行上打印20,30,40,...,50000的数字。
这适用于Debian oldstable(GNU Make 4.0,GNU Bash 4.3),但不适用于Debian stable(GNU Make 4.1和GNU Bash 4.4.12)。
Debian stable只打印字符串“{20..50000..10}”。为什么是这样?在makefile中为循环写这个的可移植方法是什么?
答案 0 :(得分:4)
如果你在shell提示符下运行它:
static void Main(string[] args)
{
#if DEBUG
try
{
#endif
UIApplication.Main(args, null, "AppDelegate");
#if DEBUG
}
catch (Exception ex)
{
var msg = ex.Message;
var temp = ex.StackTrace;
if(System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
throw;
}
#endif
}
你会发现它不像你希望的那样有效。 Make总是调用/bin/sh -c 'for i in {20..5000..10}; do echo $i; done'
(应该是一个POSIX shell)来运行配方:如果它使用调用makefile的人碰巧使用的任何shell,那将是一种可移植性的灾难。
如果你真的想用bash语法编写makefile配方,那么你必须通过添加以下内容来明确要求:
/bin/sh
到你的makefile。
答案 1 :(得分:1)
坚持POSIX兼容循环:
all:
i=20; while [ "$$i" -le 50000 ]; do \
echo "Computing $$i"; i=$$((i + 10));\
done