【问题标题】:Makefile - make finds a file whilst shell does notMakefile - make 找到一个文件,而 shell 没有
【发布时间】:2021-05-28 13:22:12
【问题描述】:

我写了一个 Makefile 的 sn-p,它在执行 rm 之前检查文件是否存在。

clean:
echo "Attempt to remove $(exec) file"
if test -f "${exec}" ; then \
echo "Removing file ${exec}" ; \
rm ${exec} ; \
else \
echo "No ${exec} file to remove" ; \
fi

if "$(wildcard *.o)" = "" ; then \
echo "No files found" ; \
else \
echo " Found $(wildcard *.o) " ; \
fi

第一个 if 语句运行良好
尝试删除 hello 文件
没有要删除的 hello 文件

而第二个产生这个:

/bin/sh: 1: main.o factorial.o: 未找到
找到 main.o factorial.o

我的问题是:为什么 ma​​ke recipe 会产生有效的输出(这些文件确实存在)而 shell 却没有?为什么 shell 甚至试图找到它们?

感谢您抽出宝贵时间阅读此问题。这是我第一次来这里,所以如果我做了不恰当的事情,请告诉我

【问题讨论】:

    标签: linux makefile gnu-make


    【解决方案1】:

    if main.oif test -f main.o 非常不同。前者尝试运行命令main.o,而后者运行命令testif "main.o factorial.o" 类似,因为它尝试运行一个名为 main.o factorial.o 的命令,shell 正确地抱怨它找不到它。您的 PATH 中不太可能有一个名为 main.o factorial.o 的文件(即名称中带有空格的单个文件)。

    但不要这样做。在取消链接之前检查文件是否存在绝对没有意义。有一个固有的竞争条件。只需尝试删除该文件,并处理如果该文件不存在可能发生的错误。

    编写rm $(wildcard *.o) 并让rm 为不存在的文件发出错误消息要容易得多。或rm -f $(wildcard *.o) 以抑制错误。如果您真的坚持遍历文件并检查,您可以执行以下操作:

    for f in $(wildcard *.o); do \
        if ! test -f "$$f"; then echo "$$f" does not exist; \
        else rm "$$f"; fi
    

    但这真的不值得。此外,这似乎毫无意义,因为wildcard 只会扩展到存在的文件。 (但请注意,这表现出相同的竞争条件:通配符可能会扩展为文件列表,但在扩展通配符和运行 rm 之间可能会创建新文件。)不要使用 wildcard像这样。明确列出您要使用的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多