以下规则清除makefile中的所有二进制文件不起作用。
test_vector <- c(14550, 16072, 15099, 19434, 21040, 14554)
它提供以下错误消息。
SHELL:=bash
PHONY: clean
clean:
for file in {"greedy","mario","pset1_mario","credit","hello"}; do \
[[ -e "${file}" ]] && rm ${file}; \
done
如果我使用make文件中的相同命令调用另一个shell脚本,它会起作用。
recipe for target 'clean' failed make: *** [clean] Error 1
有没有办法可以将这些命令放在makefile中?
答案 0 :(得分:1)
因为Error 1
并不是您认为的。
在makefile中使用SHELL:=/bin/bash -x
,您就会发现自己没有运行预期运行的内容。
具体而言,您忘记从make中转义配方中的$
,而不是在-e
测试中测试空字符串([ -e "" ]
)中的每个名称。然后每次都通过循环失败。
最后时间通过循环,当for
循环失败时,由于循环中的最后一个命令退出并返回失败,整个循环以失败返回结束,所以make看到脚本以失败告终并报告。
你想要这个:
SHELL:=bash
.PHONY: clean
clean:
for file in {"greedy","mario","pset1_mario","credit","hello"}; do \
[[ ! -e "$${file}" ]] || rm $${file}; \
done
注意shell变量上的双$$
并注意测试和条件的反转。使配方行需要返回成功,除非你希望它们终止make。
另请注意.PHONY
。 PHONY
只是一个正常目标。
更新
可能还值得指出的是,这个代码段从大括号扩展或特定于bash的[[
测试中没有获得任何结果,并且可以很容易地以sh兼容的方式重写:
clean:
for file in greedy mario pset1_mario credit hello; do \
[ ! -e "$${file}" ] || rm $${file}; \
done