Loops 如何在makefile中将for循环变量传递给shell函数
考虑下面的makefile:Loops 如何在makefile中将for循环变量传递给shell函数,loops,makefile,scripting,gnu-make,Loops,Makefile,Scripting,Gnu Make,考虑下面的makefile: CFG_DIR = /media/test/ all: for list in $(CFG_DIR); do \ echo "list is $$list"; \ for file in $(shell ls $${list}); do \ echo "file is $$file"; \ done \ done 执行make时,将生成以下结果: list is /media/test/ file
CFG_DIR = /media/test/
all:
for list in $(CFG_DIR); do \
echo "list is $$list"; \
for file in $(shell ls $${list}); do \
echo "file is $$file"; \
done \
done
执行make时,将生成以下结果:
list is /media/test/
file is Makefile
打印执行make命令的当前目录的目录列表,而不是打印/media/test/directory的目录列表
在shell函数中$$list的计算结果似乎为空值。如果有人能指出访问shell函数中for循环变量的正确方法,这将非常有用。在make函数中不能使用shell变量 考虑make是如何工作的:当它想首先运行一个配方命令时,它会展开命令中的所有make变量和函数,然后它获取结果字符串并将其传递给shell运行,然后等待shell退出。如果shell以成功代码(0)退出,那么make会说“耶,它成功了!”如果shell以失败代码(非0)退出,那么make会说“boo it failed” 这是你的食谱:
for list in $(CFG_DIR); do \
echo "list is $$list"; \
for file in $(shell ls $${list}); do \
echo "file is $$file"; \
done \
done
所以,FIRST make将扩展它,包括所有变量和函数。您有一个$(CFG\u DIR)
变量和一个$(shell…)
函数。变量只是/media/test/
。当make扩展函数时,它看到传递给shell的命令是ls${list}
。所以跑步吧:
/bin/sh -c 'ls ${list}'
嗯,除非您在环境中的某个地方设置了shell变量list
,否则它是空字符串,因此shell执行ls
,并返回当前目录的所有内容。然后,在配方中加入替代品,并将结果交给shell运行:
/bin/sh -c 'for list in /media/test; do
echo "list is $list";
for file in <current-wd-files>; do
echo "file is $file";
done
done'
这似乎是相同的。
all:
for list in $(CFG_DIR); do \
echo "list is $$list"; \
for file in `ls $${list}`; do \
echo "file is $$file"; \
done \
done