14

所以我有一个 Makefile,其中有我试图理解的以下代码:

for file_exe in `find . -name "zip_exe-*"`; do \
    ./$${file_exe} -d $(UNZIP_PATH)/lib; \
done

据我了解,这段代码将尝试找到一些可执行的 zip 并将这些 zip 文件提取到某个位置。但令我困惑的是它是如何$${file_exe}工作的。为什么$$需要双倍?我想这与一些 bash 命令是从 makefile 运行的事实有关,但我无法向自己解释为什么$$需要它并且一个简单的$不起作用,因为这个命令无论如何都在运行一个子 shell。

4

1 回答 1

23

Make 需要区分您是否希望将 a$用作引入 make-variable 引用,例如${FOOBAR}传递给 shell 的普通 $。make 规范(Section Macros)说要执行后者,您必须使用$$which 替换为单个$并传递给 shell。实际上,您的代码段显示为

for file_exe in `find . -name "zip_exe-*"`; do \
   ./${file_exe} -d some/unzip/path/lib; \
done

到壳。

样式说明:迭代由反引号创建的文件列表被认为是不好的样式,因为它可能会超出 ARG_MAX 限制。最好一个一个地读取文件名

find . -name "zip_exe-*" | \
while read -r file_exe; do \
   ./${file_exe} -d some/unzip/path/lib; \
done
于 2013-10-25T13:36:12.943 回答