无法从 makefile 中访问文件

无法从 makefile 中访问文件

每当我这样做时

for f in data/*; echo $f; done

从终端,它正确输出每条路径。

但是,如果我将上述行添加到 makefile 中,那么可以说

test:
    for f in data/*; echo $f; done

然后运行make test,它总是输出一个空字符串,而不是输出文件。它执行此操作的次数等于目录中文件/目录的数量,因此它似乎循环正确。

这是为什么?

编辑:我发现这样做$$f可以解决问题,但如果我用来计时命令$f,则会导致输出畸形。time

编辑#2:这是时间命令的示例:

从生成文件: for f in data/ascending_order/*; do time echo $$f; done

data/ascending_order/01/
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 804maxresident)k
0inputs+0outputs (0major+232minor)pagefaults 0swaps

从航站楼 for f in data/ascending_order/*; do time echo $f; done

data/ascending_order/01

real    0m0.001s
user    0m0.000s
sys     0m0.000s

答案1

第一个问题 ( echo $f) 是由于在 Makefile 中转义造成的,如果你使用,$f那么 make 会认为你指的是制作变量而不是变量,它将扩展该变量(为空),这将使您的 shellecho为每个文件运行一个带有空行的单个变量。解决方案是$通过加倍来逃避 a ,换句话说,使用 use $$f,在这种情况下 make 将消耗其中一个$s 并传递 shell a $f,这就是您想要的。


关于第二个问题(输出格式time),您看到的是 bash 内置命令time和外部命令之间输出格式的差异/usr/bin/time

make 将通过将命令传递给 来运行 Makefile 中的命令/bin/sh,一些 Linux 发行版(最著名的是 Debian 和 Ubuntu)指向dash,这是一个更简单的 shell,不实现内置命令time,最终会调用外部命令在这种情况下。

time您可以通过告诉 make 使用 bash 执行 Makefile 中的命令来获取 bash输出,您可以通过 Makefile 中的变量赋值来完成此操作:

SHELL = /bin/bash

相关内容