每当我这样做时
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