我正在尝试检查一个网站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 更好。