Linux 生成文件中的While循环
我有以下文件:Linux 生成文件中的While循环,linux,makefile,Linux,Makefile,我有以下文件: n ?= 10 all: while [[ $${n} -gt 0 ]] ; do \ echo $$n ; \ ((n = n - 1)) ; \ done 当我试图运行它(make)时,运行失败,出现错误: make: *** [all] Error 1 我不明白这次失败的原因。 感谢您的帮助。规则检查最后的返回代码。如果它不为零,make将引发错误。 在您的例子中,最后一个retrun代码是n=2(即1)的((n=n-1)
n ?= 10
all:
while [[ $${n} -gt 0 ]] ; do \
echo $$n ; \
((n = n - 1)) ; \
done
当我试图运行它(make
)时,运行失败,出现错误:
make: *** [all] Error 1
我不明白这次失败的原因。感谢您的帮助。规则检查最后的返回代码。如果它不为零,
make
将引发错误。
在您的例子中,最后一个retrun代码是n=2(即1)的((n=n-1))
结果
为了避免错误,只需将第5行修改为:
((n = n - 1)) || true; \
请注意:您正在导致makefile非常不可移植。Make始终使用
/bin/sh
调用配方。您编写的菜谱实际上是一个bash脚本,不能与POSIX/bin/sh一起使用;它只在使用/bin/bash作为/bin/sh的系统上工作。许多(大多数,取决于您如何计算它们)不工作
您可以重写:
n ?= 10
all:
n=$(n); \
while [ $${n} -gt 0 ] ; do \
echo $$n ; \
n=`expr $$n - 1`; \
done; \
true
如果将SHELL=/bin/bash添加到Makefile的顶部,那么将使用bash:当然。但为什么要在不需要的时候编写不可移植的代码呢?如果您设置了
SHELL=/bin/bash
,那么您的makefile将在不提供/bin/bash
的系统上失败。