makefile中的bash内置命令

时间:2015-10-21 14:17:19

标签: shell makefile

以下规则清除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中?

1 个答案:

答案 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。

另请注意.PHONYPHONY只是一个正常目标。

更新

可能还值得指出的是,这个代码段从大括号扩展或特定于bash的[[测试中没有获得任何结果,并且可以很容易地以sh兼容的方式重写:

clean:
        for file in greedy mario pset1_mario credit hello; do \
            [ ! -e "$${file}" ] || rm $${file}; \
        done