在Makefile中make work find awk命令

时间:2017-01-01 15:59:20

标签: awk makefile find

我找到awk行来获取python代码analyze ::

$ find ./ -name '*.py' -exec  wc -l {} \; | sort -n| awk '{print $0}{s+=$0}END{print s}'
12 ./gb/__init__.py
23 ./gb/value_type.py
40 ./setup.py
120 ./gb/libcsv.py
200
$

我尝试将它放在Makefile ::

$ cat Makefile
python_count_lines: clean
    @find ./ -name '*.py' -exec  wc -l {} \; | sort -n| awk '{print \$0}{s+=\$0}END{print s}'

但这不起作用::

$ make python_count_lines
awk: line 1: syntax error at or near }
Makefile:12: recipe for target 'python_count_lines' failed
make: *** [python_count_lines] Error 2
$

1 个答案:

答案 0 :(得分:2)

Bertrand Martel是正确的,你需要通过将它们加倍来逃避美元符号,而不是在它们前面添加反斜杠(参见info here)。

然而,其余的建议是不对的,并且不会起作用;首先,您几乎不应该在配方中使用shell功能。其次,在这里使用info函数无法正常工作,因为在第一行中您将 shell 变量RES设置为等于某个值,那么您尝试打印在第二行中生成变量RES;不仅如此,而且每一行都在一个单独的shell中运行,并且在将配方的任何部分传递给shell之前,所有make变量和函数引用都是在前面扩展的。

你只需要这样做:

python_count_lines: clean
        @find ./ -name '*.py' -exec  wc -l {} \; | sort -n| awk '{print $$0}{s+=$$0}END{print s}'