Я пытаюсь проверить веб-сайт с помощью html-proofer с правилом 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:
выполняет каждую строку в той же подоболочке ] html-proofer
заставляет игнорировать возможный выход из скрипта без удаления временной папки SHELL: = / bin / bash
Как отметил @RakeshSharma в комментариях, я использовал присваивание переменных с одним =
, поэтому оно было отложено до времени выполнения, выполняя его дважды.
Во второй раз, когда скрипт попытался получить доступ к переменной, он был выполнен снова и создал другую временную папку.
Замена =
на :=
приводит к использованию расширения immediate, поэтому временная папка создается один раз.
От
TEMP_DIR_HTMLPROOF=$(shell mktemp -d)
до этого
TEMP_DIR_HTMLPROOF:=$(shell mktemp -d)
Первая проблема, которую я вижу.
у вас есть команды
cd somewhere
do something
make создает новую оболочку для каждой строки. Таким образом, он создаст оболочку, изменит текущий рабочий каталог этой оболочки, закроет оболочку, создаст новую оболочку и что-то сделает. Это то, что вы хотите.
вам нужно сделать
cd somewhere; do something
т.е.
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)
примечание cd..
приведет к неправильному действию (в сценарии оболочки ),а здесь ничего не делает (см. выше ), и не нужно (см. выше ). В сценарии оболочки cd -
будет тем, что вы пытались сделать, хотя pushd и popd лучше.