Makefile中的Make work find pipe awk命令

Makefile中的Make work find pipe awk命令,awk,makefile,find,Awk,Makefile,Find,我有一行find awk代码来进行python代码分析: $ 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 $ 我尝试将其放在生成文件中:: $ cat Makefile python_count_lines:

我有一行find awk代码来进行python代码分析:

$ 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
$
我尝试将其放在生成文件中::

$ 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
$

Bertrand Martel说得对,你需要将美元符号加倍,而不是在它们前面加反斜杠,从而避免make中的美元符号(请参阅)

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

您只需执行以下操作:

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

Bertrand Martel说得对,你需要将美元符号加倍,而不是在它们前面加反斜杠,从而避免make中的美元符号(请参阅)

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

您只需执行以下操作:

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

你是对的,我有一些标签问题让我觉得它是有效的。你是对的,我有一些标签问题让我觉得它是有效的