Makefile 中的 rm -r 不删除目录

Makefile 中的 rm -r 不删除目录

我正在尝试检查一个网站html打样器使用Makefile规则并在结束时删除临时文件夹。

为了完成这项工作,我在一个控制台中启动服务器,并在另一个控制台中执行以下规则:

SHELL := /bin/bash
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
VIRTUALENV_BIN=~/.virtualenvs/example/bin
PYTHON=$(VIRTUALENV_BIN)/python
PIP=$(VIRTUALENV_BIN)/pip
MANAGE=$(PYTHON) workouts/manage.py

WGET=/usr/bin/wget
HTMLPROOFER=/usr/local/bin/htmlproofer
TEMP_DIR_HTMLPROOF=$(shell mktemp -d)
.ONESHELL:
htmlproofer:
    cd $(TEMP_DIR_HTMLPROOF)
    $(WGET) --recursive --html-extension --convert-links --domains localhost --no-parent localhost:8000
    - $(HTMLPROOFER) .
    echo $(TEMP_DIR_HTMLPROOF)
    cd ..
    rm -r $(TEMP_DIR_HTMLPROOF)

它创建一个临时文件夹,下载整个网站,使用 html-proofer 执行检查,最后尝试删除临时文件夹。由于某种原因我无法删除该文件夹。

即使rm -rf没有运气,我也尝试过,临时文件夹始终存在(但没有内容),例如:

假设创建的临时文件夹名为:/tmp/tmp.l21wiSkYdz,那么运行命令后,wget它将包含下载的网站/tmp/tmp.l21wiSkYdz/localhost+8000,但之后rm它仍将作为空文件夹:/tmp/tmp.l21wiSkYdz

我让它发挥作用的唯一方法是交互式使用,rm例如:rm -ir

有什么想法可以完全删除临时文件夹或者为什么可以避免删除它?

一些注意事项:

  • .ONESHELL:在同一个子 shell 中执行每一行
  • 前面的破折号html-proofer使其忽略脚本可能的退出而不删除临时文件夹
  • 使用巴什 SHELL := /bin/bash

答案1

正如 @RakeshSharma 在评论中指出的那样,我使用了单个变量赋值=,因此它被推迟到执行时间,执行两次。

脚本第二次尝试访问该变量时,它会再次执行并创建另一个临时文件夹。

更改=with:=使其使用即时扩展,因此它会创建临时文件夹一次。

TEMP_DIR_HTMLPROOF=$(shell mktemp -d)

对此

TEMP_DIR_HTMLPROOF:=$(shell mktemp -d)

答案2

我看到的第一个问题。

你有你的命令

cd somewhere
do something

make 为每一行创建一个新的 shell。因此它将创建一个 shell,更改此 shell 当前的工作目录,关闭 shell,创建一个新 shell,然后执行某些操作。这就是你现在想要的。

你需要做

cd somewhere; do something

IE

htmlproofer:
    cd $(TEMP_DIR_HTMLPROOF); $(WGET) --recursive --html-extension --convert-links --domains localhost --no-parent localhost:8000 - $(HTMLPROOFER) . ;echo $(TEMP_DIR_HTMLPROOF)
    rm -r $(TEMP_DIR_HTMLPROOF)

notecd ..会做错误的事情(在 shell 脚本中),但这里什么也不做(见上文),并且不需要(见上文)。在 shell 脚本中这cd -将是您想要做的事情,尽管 pushd 和 popd 更好。

相关内容