Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何在makefile中将for循环变量传递给shell函数_Loops_Makefile_Scripting_Gnu Make - Fatal编程技术网

Loops 如何在makefile中将for循环变量传递给shell函数

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

考虑下面的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 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